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