Posted on 2010-10-18 15:57
李东亮 阅读(2140)
评论(0) 编辑 收藏 引用
ZOJ 1051 A New Growth
Industry
这道题严格来说属于一道简单的模拟题,但是题目描述的太繁琐了,影响了理解。而一旦看懂题意后就好办了。
这道题的大意就是说在一个20X20的方格中养一种细菌,这种细菌的DNA被改造了,周围密度大时,繁殖减慢,密度减少,反之密度增加,且数量变动大小由DNA序列决定,然后根据输入进行模拟,输入n天后的情况。
题就这么简单,但是需要注意的是不能计算完一个方格的变化量之后立刻改变该方格的值,因为周围的方格k值还需要引用当前的密度值。唯一可以使用的技巧就是把数组开大点,题目是20X20,可以开到22X22,只使用下标1-20来表示题目中的方格,这样在计算时就不用判断是否越界了,可以节省一些时间。
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
int a[22][22];
int d[16];
int b[20][20];
int main(void)
{
int t;
int n;
int i, j;
int k;
//freopen("in.txt", "r", stdin);
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (i = 0; i < 16; ++i)
{
scanf("%d", &d[i]);
}
for (i = 1; i < 21; ++i)
{
for (j = 1; j < 21; ++j)
{
scanf("%d", &a[i][j]);
}
}
while (n--)
{
for (i = 1; i < 21; ++i)
{
for (j = 1; j < 21; ++j)
{
k = a[i-1][j] + a[i][j-1] + a[i+1][j] + a[i][j+1] +a[i][j];
b[i-1][j-1] = d[k];
}
}
for (i = 1; i < 21; ++i)
{
for (j = 1; j < 21; ++j)
{
a[i][j] += b[i-1][j-1];
if (a[i][j] < 0)
a[i][j] = 0;
else if (a[i][j] > 3)
a[i][j] = 3;
}
}
}
for (i = 1; i < 21; ++i)
{
for (j = 1; j < 21; ++j)
{
switch(a[i][j])
{
case 0:putchar('.');break;
case 1:putchar('!');break;
case 2:putchar('X');break;
case 3:putchar('#');break;
}
}
printf("\n");
}
if (t != 0)
printf("\n");
}
return 0;
}