ZOJ-1051 模拟细菌培养
1051:20*20的培养皿。 密度为方格及上下左右共5个方格的和值。每个小方格的取值范围为0~3 所以5个方格密度范围为0~15 现在给出一段长度为16的基因 表明了不同密度对下一天的影响。给出初始状态和模拟天数,求结果。结果表现形式如下
Sample Input:
1
2
0 1 1 1 2 1 0 -1 -1 -1 -2 -2 -3 -3 -3 -3
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample Output:
##!.................
#!..................
!...................
....................
....................
....................
....................
.........!..........
........!#!.........
.......!#X#!........
........!#!.........
.........!..........
....................
....................
....................
....................
....................
....................
....................
....................
思路:题目不是很难。涉及了二维数组的指针,长久不用有些遗忘了。。
列数固定的二维指针形式 :int dish[20][20]; int (*curr)[20] = dish;
如果不定列数的二维数组作参数可以用一维实现,直接 int ** 不行。
p[0]传入void func(int *p, int n, int m){ for(int i=0; i < n; i++) for(int j=0; j < m; j++) p[i*m+j]=i+j; }#include<stdio.h>#include<iostream>using namespace std;int dish[20][20];int dish2[20][20];//计算密度int population(int x,int y,int p[20][20]){int sum=0;sum+=p[x][y];if(x-1>=0) //leftsum+=p[x-1][y];if(y-1>=0) //upsum+=p[x][y-1];if(x+1<20) //rightsum+=p[x+1][y];if(y+1<20) //downsum+=p[x][y+1];return sum;}int main(){int N;int day;int dna[16];int K;char sign[4]={'.','!','X','#'};int (*curr)[20] = dish;int (*next)[20] = dish2;int (*tmp)[20];scanf("%d",&N);while(N--){scanf("%d",&day);//读入DNAfor(int i=0;i<16;i++)scanf("%d",&dna[i]);//读入初始for(int i=0;i<20;i++)for(int j=0;j<20;j++)scanf("%d",&curr[i][j]);for(int d=0;d<day;d++){for(int i=0;i<20;i++)for(int j=0;j<20;j++){K=population(i,j,curr);next[i][j] = curr[i][j]+dna[K];//范围修正if(next[i][j]>3)next[i][j]=3;else if(next[i][j]<0)next[i][j]=0;}//交换数组tmp=next;next=curr;curr=tmp;}for(int i=0;i<20;i++){for(int j=0;j<20;j++)printf("%c",sign[curr[i][j]]);printf("\n");}if(N!=0)cout<<endl;}}