前提・実現したいこと
簡単なマインスイーパのプログラムについてです。
H*Wのマス目が与えられ、.は空きマス、#は爆弾マスに対応しています。
こうした入力を引き取ったうえで、各空きマスに対応する . を、その空きマスの周囲8方向に隣接するマスにおける爆弾マスの個数を表す数字で置き換え、出力するコードを書こうとしています。
該当のソースコード
Python3
1h, w = list(map(int, input().split())) 2field = ['.' + input() + '.' for _ in range(h)] 3field = ['.'*(w+2)] + field + ['.'*(w+2)] 4 5for i in range(1, h+1): 6 ans = '' 7 for j in range(1, w+1): 8 if field[i][j] == '#': 9 ans += '#' 10 else: 11 c = [field[i-1][j-1], field[i-1][j], field[i-1][j+1], field[i][j-1], field[i][j], field[i][j+1], field[i+1][j-1], field[i+1][j], field[i+1][j+1]].count('#') 12 ans += str(c) 13 print(ans)
###疑問点
上のコードでたまたまうまく出力を得ることができました。たとえば、
3 5 ..... .#.#. .....
をとって、正しく
11211 1#2#1 11211
を返すことができるようになりました。
しかし、上のコードで
ans = ''
として空の値を用意するタイミングを、他に移すとうまくいかなくなる――上のコードにおける位置のみ(?)が正解である――理由がわかりません。例えばこれを一行上に書いて
…… ans = '' for i in range(1, h+1): for j in range(1, w+1): ……
とすると
11211 112111#2#1 112111#2#111211
が、
また1行下にして
…… for i in range(1, h+1): for j in range(1, w+1): ans = '' ……
とすると
1 1 1
が、それぞれ返ってくるのですが、その理由がよくわかりません。ご教授いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/04 03:01