题意:给一个20*20矩阵,每个位置上有一个0-3之间的值,给定16个元素的数组D,对于矩阵的每个元素,它的变化为D[k],其中k为自身元素+上下左右元素的和。最后,根据最后的矩阵输出响应的字符。
//11222749 c00h00g 1120 Accepted 168K 0MS C++ 1363B 2013-01-30 17:20:08
//WA 2次 原因:这题目不是以EOF结束,而且只有一组测试样例
#include<stdio.h>
#include<stdlib.h>
int day;
int d[16];
int mat[20][20];
int tmp[20][20];
int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int calk(int x,int y){
int sum=mat[x][y];
for(int i=0;i<4;i++){
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx>=0&&xx<20&&yy>=0&&yy<20)
sum+=mat[xx][yy];
}
return sum;
}
int main(){
scanf("%d",&day);{
for(int i=0;i<16;i++)
scanf("%d",&d[i]);
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
scanf("%d",&mat[i][j]);
while(day--){
for(int i=0;i<20;i++)
for(int j=0;j<20;j++){
tmp[i][j]=0;
tmp[i][j]=mat[i][j]+d[calk(i,j)];
if(tmp[i][j]<0) tmp[i][j]=0;
if(tmp[i][j]>3) tmp[i][j]=3;
}
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
mat[i][j]=tmp[i][j];
}
for(int i=0;i<20;i++){
for(int j=0;j<20;j++){
if(mat[i][j]==0) printf(".");
if(mat[i][j]==1) printf("!");
if(mat[i][j]==2) printf("X");
if(mat[i][j]==3) printf("#");
}
printf("\n");
}
}
return 0;
}