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

poj 2339 Rock, Scissors, Paper

2013年09月25日 ⁄ 综合 ⁄ 共 1104字 ⁄ 字号 评论关闭

在一个矩阵里面玩 石头剪刀纸,规则大家都懂的,每次如果上下左右的被打败,则其将被取代为胜利者的标志,这里不能用原图来进行处理,所以需要建立个参考矩阵,每次都用参考矩阵来进行判断,然后更改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;
}

抱歉!评论已关闭.