您的位置:首页 > 其它

ZOJ1051 A New Growth Industry

2008-10-23 19:45 351 查看
这道题就是读懂题目太费劲了,非要扯到什么DNA上去,其实就是简单的数组处理,和上下左右的加加,然后查表把所得值加到当前项上来,若越界则处理下。
#include <iostream>

using namespace std;

const int MAXNUM = 20;//培养皿是*20的大小

char SignTable[]=".!X#";//符号表

int dish[MAXNUM][MAXNUM],res[MAXNUM][MAXNUM];

int day,d[16];

int main()

{

int cases;//测试样例数

int i,j,k;

while (cin>>cases)

{

while (cases--)

{

cin>>day; //培养天数

//输入DNA序列信息

for (k=0; k<16; ++k)

cin>>d[k];

//输入培养皿数据

for (i=0; i<MAXNUM; ++i)

for (j=0; j<MAXNUM; ++j)

cin>>dish[i][j];

while (day--)

{

for (i=0; i<MAXNUM; ++i)

for (j=0; j<MAXNUM; ++j)

{

k = dish[i][j];

//和上下左右的结合起来

if (i-1>=0)

k += dish[i-1][j];

if (i+1<MAXNUM)

k += dish[i+1][j];

if (j-1>=0)

k += dish[i][j-1];

if (j+1<MAXNUM)

k += dish[i][j+1];

res[i][j] = dish[i][j]+d[k];

//不能超过0~3的范围

if (res[i][j]>3)

res[i][j] = 3;

if (res[i][j]<0)

res[i][j] = 0;

}

memcpy (dish,res,sizeof(dish));

}

for (i=0; i<MAXNUM; ++i)

{

for (j=0; j<MAXNUM; ++j)

cout<<SignTable[dish[i][j]];

cout<<endl;

}

//样例之间有一个空行

if (cases!=0)

cout<<endl;

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: