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