//开始做这一题的时候,读题都读了很久,完全没有读懂,感觉这一题也出得太烂了,题意的疑点成千上万,让人无从下手! //最后只有看别人的解题报告才知道!题意:在一个二维方格中,有三种物种: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"); }