' P '

whatever I will forget

マス系: ABC 075 B - Minesweeper

二次元配列 & マス系の典型問題

if/else ifでゴリゴリ書いて解けるかどうかも微妙...

まあ、とりあえずこういうグリッド系では自分の周りに動いたら座標がどう変わるかという指標を別途arrayで持っておくとよいようです。

画像だと赤が自分のいる場所だとする
arrayは下から初めて右、斜め右...という順序(この解説がないサンプルコードが多く理解が難しかった)

    final int[] dx = {1,1,0,-1,-1,-1,0,1};
    final int[] dy = {0,1,1,1,0,-1,-1,-1};

この問題では、いま自分がいる座標から、8方向を見たときに、爆弾'#'があるかどうか確認し、あればcount++を行い、自分の場所にそれを代入するという解き方です。

少し具体的なロジック

  • xyの二次元arrayの全探索
  • もし今の自分の座標が爆弾では無ければ周りの8方向を確認する
  • 座標の全探索(今回は8方向なのでmax8ループ)
  • 自分のいる座標 + 座標arrayを行なって8方向の位置を求め出す
  • どこかの方向に爆弾'#"があるか確認
  • あれば元々の自分の位置を数字の1に置き換え、他の方向にも爆弾があれば+1インクリメントする
    いやはや、こんなの思いつかないです...

あと、charで行う場合に初めてintに変換するロジックが必要になります。
これについても知ってないとできない系の変換技が発生するのでしっかりと覚えておかないといけないです。

mankozooyork.hatenablog.com

pythonでの解答例

dx = [1,1,0,-1,-1,-1,0,1]
dy = [0,1,1,1,0,-1,-1,-1]

h,w = list(map(int, input().split()))
s = [input() for i in range(h)]
result = [[0 if v == '.' else '#' for v in row] for row in s]

for i in range(h):
    for j in range(w):
        if(s[i][j] == '.'):
            for di, dj in zip(dx, dy):
                ni, nj = i+di, j+dj
                if ni < 0 or ni >= h or nj < 0 or nj >= w:
                    continue
                if s[ni][nj] == '#':
                    result[i][j] += 1

for row in result:
    print(*row, sep='')