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

hamayanhamayan's blog

隣接カウント [第四回 アルゴリズム実技検定 C]

https://atcoder.jp/contests/past202010-open/tasks/past202010_c

解説

https://atcoder.jp/contests/past202010-open/submissions/21465859

シミュレーション問題というか実装問題。
問題文に書かれていることを実装しよう。

今回要求されているような周囲のマスをなめていくには差分を全探索するのがオススメである。
そのマスと上下左右ななめに隣接したマスということはそのマスからのx,yの差分がどちらも[-1,1]の範囲内のマスであるということになる。
この範囲を全探索して、自分の座標に足し合わせて隣接マスの座標を得よう。
外にはみ出してしまう可能性があるので、境界チェックをちゃんと行う事。

int H, W;
string S[30];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> H >> W;
    rep(y, 0, H) cin >> S[y];

    rep(y, 0, H) {
        rep(x, 0, W) {
            char c = '0';
            rep(dx, -1, 2) rep(dy, -1, 2) {
                int xx = x + dx;
                int yy = y + dy;
                if (0 <= xx && xx < W && 0 <= yy && yy < H) {
                    if (S[yy][xx] == '#') c++;
                }
            }
            printf("%c", c);
        }
        printf("\n");
    }
}