天天看点

ZOJ1051 A New Growth Industry

这道题就是读懂题目太费劲了,非要扯到什么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)

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

                cout<<endl;   

            //样例之间有一个空行

            if (cases!=0) 

        } 

    }

    return 0;   

}

本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/23/1318209.html,如需转载请自行联系原作者