Posted on 2010-10-18 15:57
李東亮 閱讀(2154)
評論(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;
}