天天看點

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,如需轉載請自行聯系原作者