二次元配列でマップ問題を解く
次のような問題を考えます。
[問題]
長方形状のマップデータ(文字列)が与えられます。 1マスのデータは'#'が爆弾を表し、'.'は何もない空間(空きマス)を表します。 空きマスの上下左右および斜めの8方向に隣接しているマスの中に 爆弾のあるマスが何個あるかを調べて、その数を空きマス'.'に置き換えて 長方形状のマップを出力してください。
[条件]
・マップの縦幅と横幅は1以上かつ50以下です。 ・1マスのデータは'#'(爆弾)または'.'(何もない空間)のみです。
解法・ソースコード
長方形のマップを表すために、str型の変数からなるlistを活用します。
長方形状のマップを上からy番目、左からx番目のマスを(x, y)と表します。
入力の文字列データを1マスずつの2次元配列(2次元リスト)に設定します。(14行目)
この問題では、各空きマス(x, y)に対して、その周囲8マスにある爆弾の個数を数えます。
マス(x, y)の周囲8マスは (x+1, y)、(x-1, y)、(x, y+1)、(x, y-1)、(x+1, y+1)、(x+1, y-1)、(x-1, y+1)、(x-1, y-1) と表すことができます。
これらのマスを調べるために、周囲8方向に隣接するマスとの座標の差分値を表す配列を用意しておくと便利です。(17行目)
[Google Colaboratory]
1 | #---------- 入力例 ---------- |
[実行結果]
【 元のマップ 】 ........ ..#...#. ........ ....#... .....#.. 【 隣接する爆弾の個数を表示したマップ 】 01110111 01#101#1 01121211 0001#210 00012#10
空きマスの周辺にある爆弾数をカウントしてマップを表示することができました。