//题目一直没理解题意。后来实在忍不住看了一下别人的代码分析,听不错的就按照别人的来了
思路:题目不是很难。涉及了二维数组的指针,长久不用有些遗忘了。。
列数固定的二维指针形式 :int dish[20][20]; int (*curr)[20] = dish;
如果不定列数的二维数组作参数可以用一维实现,直接 int ** 不行。
#include<iostream>
#include<cstdio>
using namespace std;
int dish[20][20];
int dish2[20][20];
char rep[4]={'.','!','X','#'};
int densities(int x,int y,int p[20][20])
{
int sum=0;
sum+=p[x][y];
if(x-1>=0)
sum+=p[x-1][y];
if(y-1>=0)
sum+=p[x][y-1];
if(x+1<20)
sum+=p[x+1][y];
if(y+1<20)
sum+=p[x][y+1];
return sum;
}
int main()
{
int n,day,den;
int d[16];
int (*curr)[20] = dish;
int (*next)[20] = dish2;
int (*tmp)[20];
int i,j,k;
cin>>n;
while(n--)
{
cin>>day;
for(i=0; i<16; i++)
cin>>d[i];
for(i=0; i<20; i++)
for(j=0; j<20; j++)
cin>>curr[i][j];
for(k=0; k<day; k++)
{
for(i=0; i<20; i++)
{
for(j=0; j<20; j++)
{
den=densities(i,j,curr) ;
next[i][j] = curr[i][j]+d[den];
//范围修正
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",rep[curr[i][j]]);
printf("\n");
}
if(n!=0)
cout<<endl;
}
return 0;
}