POJ 2339

来源:互联网 发布:怎样提升淘宝等级 编辑:程序博客网 时间:2024/05/29 03:18

题目链接:http://poj.org/problem?id=2339

题目大概意思就是说,给你一个二维的矩阵,每个单元里面存放一个字符,该字符来自R、S、P,水平或者垂直方向相邻的单元格,如果存放的字符不相同,就会进行战争,每场战争中R赢S,S赢P,P赢R(类似于平时我们玩的石头、剪刀、布的游戏),现在给你一个二维矩阵,问你n天过后,这个二维矩阵里面存放的状态。


这是一个简单的模拟题目,让程序来进行相应的模拟,每步需要判断该位置的上下左右是否有能赢该字符的字符,如果有,则进行替换,没有,则什么都不用做,由于题目中说了,今天赢了的状态,必须到了明天才清楚,所以你需要维持相邻两天的状态,由于进行模拟的过程中,需要判断下标值是否越界的问题,我就将数组下标从一开始,便于处理,这题都没什么说的,代码里见真章吧:

#include<cstdio>#include<algorithm>#define MAX_N 110char maze[2][MAX_N][MAX_N];char hash[MAX_N];int main(){    int t;    hash['R'] = 'P',hash['S']='R',hash['P']='S';    scanf("%d",&t);    while(t--)    {        int r,c,n,cur = 0;        scanf("%d%d%d",&r,&c,&n);        for(int i=1;i<=r;++i)            scanf("%s",&maze[cur][i][0]+1);        for(int i=0;i!=n;++i)        {            for(int j=1;j<=r;++j)            {                for(int k=1;k<=c;++k)                {                    //得到能赢该字符的字符                    char temp = hash[maze[cur][j][k]];                    //判断它的四个方向是否存在该字符,如果有,就改为能赢他的字符,没有,什么都不做                    if(maze[cur][j-1][k]==temp||maze[cur][j][k-1]==temp||maze[cur][j+1][k]==temp||maze[cur][j][k+1]==temp)                        maze[cur^1][j][k] = temp;                    else                        maze[cur^1][j][k] = maze[cur][j][k];                }            }            cur ^=1;        }        for(int i=1;i<=r;++i)            printf("%s\n",&maze[cur][i][0]+1);        printf("\n");    }    return 0;}