私はCodefightsの問題に固執しています。Python:なぜこのアルゴリズムは意図したとおりに動作しませんか?
人気のMinesweeperゲームでは、鉱山のあるボードがあり、鉱山を持たないセルに隣接するセルの鉱山の総数を示す数字が表示されます。いくつかの鉱山の配置から始めて、地雷探知機のゲーム設定を作成したいと考えています。
例
matrix = [[True, False, False],
[False, True, False],
[False, False, False]]
について出力は次のようになります。
minesweeper(matrix) = [[1, 2, 1],
[2, 1, 1],
[1, 1, 1]]
だから、私が理解、我々は我々がする必要があるので、行列全体をトラフ見ているからどのセルが真であるかを知っている、つまり爆弾が入っているとわかったら、それを見つけたら、すべての隣接セルの値を増やすべきです境界セルのif/elifステートメントを使用してコードを記述しようとしましたが(エラーをスローしないように)、コードは実際には醜く長くなりました。だから私が思い付くことができる唯一の事は、このでした:
def minesweeper(matrix):
# First creating the same matrix but instead full of zeros.
result = [[0]* len(matrix[0]) for row in matrix]
# Start iterating through the original matrix to find True elements
for y in range(len(matrix)):
for x in range(len(matrix[0])):
if matrix[y][x] == True:
# The remaining code tries to increment all possible neighbours by 1.
for j in range(-1,2):
for i in range(-1,2):
# If statement so that we do not increment the bomb cell itself.
if not (j == 0 and i == 0):
try:
result[y+j][x+i] += 1
except:
continue
return result
input = [[True, False, False],
[False, True, False],
[False, False, False]]
のための私の関数の出力は
[[1, 2, 2], [2, 1, 2], [2, 2, 2]]
誰もが、それは仕事をdoesntなぜアイデアを持っているのですか?また、try/exceptステートメントでエラーをキャッチしようとする必要があり、これはおそらく悪い習慣であることを知っています。
例をさらに修正してください。小文字の「true」と「false」は文字列(つまり「true」と「false」)または大文字にする必要があります。また、内側ループの 'yi'と' xi'は実際には定義されていません。したがって、コードが壊れているように見えます。 – alisianoi
[リストの変更はサブリスト間で予期せず反映されます](https:// stackoverflow。com/questions/240178/list-of-lists-changes-across-sublists-unexpectedly) –
@ŁukaszRogalskiそれは重複していません。結果変数は正しく初期化されます。 – Enfenion