我被困在Codefights上的一個問題上。這裏是描述:Python:爲什麼這個算法不能按預期工作?
在流行的掃雷遊戲中,你有一個有一些地雷的電路板,那些不包含地雷的單元有一個數字,表示相鄰單元中的地雷總數。從一些排雷開始,我們要創建一個掃雷遊戲設置。
例
對於
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]]
任何人有一個想法,爲什麼它不工作?而且我也知道你應該嘗試用try/except語句來捕獲錯誤,並且這可能是不好的做法,我只是想不出超長的if/elif語句的另一種方式。
請進一步解決您的例子:小寫的'真'和'FALSE'應弦(即「真」和「假」)或大寫。另外,內部循環中的'yi'和'xi'實際上沒有定義。所以,你的代碼看起來很糟糕。 – alisianoi
[列表中的列表更改意外地反映到子列表中]的可能重複(https:// stackoverflow。com/questions/240178/list-of-lists-changes-reflected-across-sublists-unexpectedly) –
@ŁukaszRogalski它不是重複的。結果變量被正確初始化。 – Enfenion