仔细读题。
#include <cstdio>
const int N = 20;
const int DNA = 16;
struct Node
{
int v;
int sum;
};
Node cultrue[N+2][N+2];
int change[DNA];
int origin[N+2][N+2];
void read_cultrue()
{
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
{
scanf("%d", &culture[i][j].v);
cultrue[i][j].sum = 0;
}
}
const int ROW[] = {-1, 1, 0, 0};
const int COL[] = {0, 0, 1, -1};
void addup()
{
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
{
cultrue[i][j].sum = cultrue[i][j].v;
for (int k = 0; k < 4; k++)
cultrue[i][j].sum += cultrue[i+ROW[k]][j+COL[k]].v;
}
}
void vary()
{
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
{
int temp = cultrue[i][j].v + change[cultrue[i][j].sum];
if (temp >= 3) temp = 3;
else if (temp <= 0) temp = 0;
cultrue[i][j].v = temp;
}
}
void print_cultrue()
{
const char itc[] = ".!X#";
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++) printf("%c", itc[cultrue[i][j].v]);
putchar('\n');
}
}
int main()
{
// input
int day;
scanf("%d", &day);
for (int i = 0; i < DNA; i++) scanf("%d", &change[i]);
read_cultrue();
// work
int cnt = 0;
while (day--)
{
cnt++;
addup();
vary();
}
// print
print_cultrue();
return 0;
}