//开始做这一题的时候,读题都读了很久,完全没有读懂,感觉这一题也出得太烂了,题意的疑点成千上万,让人无从下手!
//最后只有看别人的解题报告才知道!题意:在一个二维方格中,有三种物种:P,S,R 他们会互相进行攻击,P可以打败R,S可
//打败P,R可打败S,他们每天都会发生战争,别打败的物种的方格会别打胜的物种霸占,问经过n天之后,方格上的物种位置情况如何!
//这一题需要注意的是: 他们战斗的结果是在夜晚才进行汇总的,在白天的时候,战斗一直都是在那个方格上,他们的位置不会是一
//经过战斗就发生改变的! 这就需要开二个二维的数组进行方格位置的储存了!一个是用来战斗时使用的位置方格,一个是用来战斗时
//临时结果的位置方格储存!例如第二个案例:grid数组就储存方格位置 ,而tmp数组就储存临时方格位置!第一天的战斗依据就是grid数组
//这一整天它的方格上的位置都没有改变,而tmp数组就是对每一次的战斗结果的储存!
#include <iostream>
#include <string>
using namespace std;
char grid[110][110];//储存战斗的依据
char tmp[110][110];//储存战斗的临时结果
int main()
{
int tc, r, c, n, i, j;
cin >> tc;
while (tc--)
{
cin >> r >> c >> n;
for (i = 1; i <= r; i++)
for (j = 1; j <= c; j++)
{
cin >> grid[i][j];
tmp[i][j] = grid[i][j];
}
while (n--)
{
//每一天的战斗,依据是grid数组的储存,结果是储存在tmp数组中
for (i = 1; i <= r; i++)
{
for (j = 1; j<= c; j++)
{
if (grid[i][j] == 'R')
{
if (i-1 > 0 && grid[i-1][j] == 'S')
tmp[i-1][j] = 'R';
if (j-1 > 0 && grid[i][j-1] == 'S')
tmp[i][j-1] = 'R';
if (i+1 <= r && grid[i+1][j] == 'S')
tmp[i+1][j] = 'R';
if (j+1 <= c && grid[i][j+1] == 'S')
tmp[i][j+1] = 'R';
}
else if (grid[i][j] == 'S')
{
if (i-1 > 0 && grid[i-1][j] == 'P')
tmp[i-1][j] = 'S';
if (j-1 > 0 && grid[i][j-1] == 'P')
tmp[i][j-1] = 'S';
if (i+1 <= r && grid[i+1][j] == 'P')
tmp[i+1][j] = 'S';
if (j+1 <= c && grid[i][j+1] == 'P')
tmp[i][j+1] = 'S';
}
else if (grid[i][j] == 'P')
{
if (i-1 > 0 && grid[i-1][j] == 'R')
tmp[i-1][j] = 'P';
if (j-1 > 0 && grid[i][j-1] == 'R')
tmp[i][j-1] = 'P';
if (i+1 <= r && grid[i+1][j] == 'R')
tmp[i+1][j] = 'P';
if (j+1 <= c && grid[i][j+1] == 'R')
tmp[i][j+1] = 'P';
}
}
}
//每一天的战斗结束之后,就进行战斗结果的汇总,最后赋值给grid数组!
for (i = 1; i <= r; i++)
for (j = 1; j <= c; j++)
grid[i][j] = tmp[i][j];
}
for (i = 1; i <= r; i++)
{
for (j = 1; j <= c; j++)
cout << grid[i][j];
cout << endl;
}
if (tc != 0)
cout << endl;
}
system("pause");
}
poj 2339 Rock, Scissors, Paper
最新推荐文章于 2018-05-30 10:32:08 发布