现在的位置: 首页 > 综合 > 正文

poj 2339 Rock, Scissors, Paper

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

抱歉!评论已关闭.