CCF NOI 1057.はさみ石布

4583 ワード

タイトルはBartの妹Lisaが2次元行列の上で新しい文明を創造したことを説明します.マトリックス上の各位置は3つの生命形態の1つに占められている:石、ハサミ、布.毎日、上下左右に隣接する異なる生命形態で戦闘が発生する.戦いの中で、石は永遠にハサミに勝って、ハサミは永遠に布に勝って、布は永遠に石に勝っています.毎日が終わると、敗者の領地は勝者に占領される.あなたの仕事はn日後のマトリクスの占有状況を計算することです.
入力第1行は、行列の行数、列数、および日数を表す3つの正の整数r,c,nを含む.各整数は100を超えません.次にr行、各行c文字は、マトリクスの初期時に占有される場合を記述する.各位置の文字はR,S,Pの3つしかなく,それぞれ石,ハサミ,布を表す.隣接する文字の間にスペースがありません.
出力n日後のマトリクス占有状況を出力します.各位置の文字はR,S,Pの3つしかなく,隣接する文字の間にスペースがない.
サンプル入力3 3 1 RRR RSR RRR
サンプル出力RRR RRR RRR RRR
構想:C++プログラムはマトリクス全体に直接アクセスできないため、テーマの中の変化要求は同時に発生するので、私たちは2つのマトリクスを定義することができます:1つは原始マトリクス(a)、つまり前回の変化後のマトリクスです;もう1つは、変化中のマトリクス(b)、すなわち変化しているマトリクスである.「for」サイクルですべてのa行列要素に順次アクセスし、まず左右に戦争(変化)が発生し、その後上下に戦争(変化)が発生し、毎回変化した結果をb行列に格納し、毎日(変化全体)が終わると、b行列をa行列にコピーし、すでに発生した変化(前回変化の結果)とする.
コードは次のとおりです.

#include 
using namespace std;
int main()
{
    int r,c,n;
    char a[101][101],b[101][101];
    cin>>r>>c>>n;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            cin>>a[i][j];
    for(int d=1;d<=n;d++)
    {
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
                b[i][j]=a[i][j];
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
            {
                if(b[i][j]=='R'&&(b[i-1][j]=='P'||b[i+1][j]=='P'||b[i][j-1]=='P'||b[i][j+1]=='P'))
                    a[i][j]='P';
                else if(b[i][j]=='S'&&(b[i-1][j]=='R'||b[i+1][j]=='R'||b[i][j-1]=='R'||b[i][j+1]=='R'))
                    a[i][j]='R';
                else if(b[i][j]=='P'&&(b[i-1][j]=='S'||b[i+1][j]=='S'||b[i][j-1]=='S'||b[i][j+1]=='S'))
                    a[i][j]='S';
            }
    }
    for(int i=1;i<=r;i++)
     {
         for(int j=1;j<=c;j++)
            cout<cout<return 0;
}