はまやんはまやんはまやん

hamayanhamayan's blog

Landslide [第二回 アルゴリズム実技検定 C]

https://atcoder.jp/contests/past202004-open/tasks/past202004_c

解説

https://atcoder.jp/contests/past202004-open/submissions/12894322

文字列を扱う問題は慣れないと難しいかと思う。
問題で与えられている操作をシミュレーションしよう。

完全に自分の好みであるが、iをy, jをxを変換して実装をしている。
説明もそれに合わせる。
シミュレーションするだけであるが、
「(y+1,x-1),(y+1,x),(y+1,x+1)のどれかにXが書かれているとき」の判定がややこしいかもしれない。
逆を取って考えてもいいが、自分はこういう場合は「ok := 条件を満たすか」を使って、
ok=falseが初期値で、3つのifを作り、条件を満たせばok=trueとすることをしている。
こうすれば、3つのifのうち、どれかが条件を満たせばok=trueとなる。
あとは、順番にやっていくだけ。

int N;
string S[50];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, N) cin >> S[i];

    rrep(y, N - 2, 0) {
        rep(x, 1, 2 * N - 2) if(S[y][x] == '#') {
            bool ok = false;

            if (S[y + 1][x - 1] == 'X') ok = true;
            if (S[y + 1][x] == 'X') ok = true;
            if (S[y + 1][x + 1] == 'X') ok = true;

            if (ok) S[y][x] = 'X';
        }
    }

    rep(y, 0, N) cout << S[y] << endl;
}