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;
}