poj 2339 Rock, Scissors, Paper

来源:互联网 发布:紧急域名网页升级访问 编辑:程序博客网 时间:2024/06/05 05:49

在一个矩阵里面玩 石头剪刀纸,规则大家都懂的,每次如果上下左右的被打败,则其将被取代为胜利者的标志,这里不能用原图来进行处理,所以需要建立个参考矩阵,每次都用参考矩阵来进行判断,然后更改map矩阵的情况,好像这样时间复杂度确实不小,500ms水过。

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N = 105;int row, col, n;char map[N][N];char refer[N][N];int di[4][2] = {0,1,1,0,-1,0,0,-1};bool judge(int x,int y){    if(x>0&&x<=row&&y>0&&y<=col)        return true;    return false;}void print(){    for(int i=1; i<=row; ++i)    {        for(int j=1; j<=col; ++j)        printf("%c",map[i][j]);       putchar(10);    }    putchar(10);}void ini(){    for(int i=1; i<=row; ++i)        for(int j=1; j<=col; ++j)         refer[i][j] = map[i][j];}int main(void){    int ncase;    scanf("%d",&ncase);    while(ncase--)    {      scanf("%d%d%d",&row,&col,&n);      for(int i=1; i<=row; ++i)      {          scanf("%s",map[i]+1);      }      while(n--)      {       ini();      for(int i = 1; i<=row; ++i)        for(int j=1; j<=col; ++j)      {          if(refer[i][j] == 'R')          {            int a,b;            for(int k=0; k<4; ++k)            {                a = i + di[k][0];                b = j + di[k][1];                if(judge(a,b)&&refer[a][b]=='S')                map[a][b] = 'R';            }          }          else if(refer[i][j] == 'S')          {             int a,b;            for(int k=0; k<4; ++k)            {                a = i + di[k][0];                b = j + di[k][1];                if(judge(a,b)&&refer[a][b]=='P')                map[a][b] = 'S';            }          }          else          {              int a,b;            for(int k=0; k<4; ++k)            {                a = i + di[k][0];                b = j + di[k][1];                if(judge(a,b)&&refer[a][b]=='R')                map[a][b] = 'P';            }          }         }        }        print();    }    return 0;}