2339:Rock, Scissors, Paper
keyword
シミュレーション C++
概要
グー、チョキ、パーの3状態でセルオートマトンを動かしたときnステップ後の状態を求める問題。
さすがにこれは愚直に書くしかないと思う。
inline bool isSafe(char a, char b){ if(a == b) return true; if(a == 'R') return b=='S'; if(a == 'S') return b=='P'; if(a == 'P') return b=='R'; return '-'; } inline char changeTo(char a){ if(a=='R') return 'P'; if(a=='S') return 'R'; if(a=='P') return 'S'; } int main(){ int rept, w, h, n, i, j, k, l; int dx[] = {1,0,-1,0}, dy[] = {0,1,0,-1}; char board[2][101][101]; char c; scanf("%d\n",&rept); LOOP(rept){ if(loopCount > 1) printf("\n"); scanf("%d%d%d\n",&h,&w,&n); REP(i,101)REP(j,101) board[1][i][j] = board[0][i][j] = '\0'; REP(i,h)scanf("%s\n",board[0][i]); REP(i,h) board[1][i][w] = '\0'; REP(k,n){ int r = k%2; REP(i,h)REP(j,w){ REP(l,4){ int ny = i + dy[l], nx = j + dx[l]; if(0<= ny && ny<h && 0<= nx && nx<w){ if(!isSafe(board[r][i][j], board[r][ny][nx]))break; } } if(l<4){ board[1-r][i][j] = changeTo(board[r][i][j]); } else board[1-r][i][j] = board[r][i][j]; } } REP(i,h)printf("%s\n",board[k%2][i]); } return 0; }