我目前正在研究N Queens 問題,我有一個非常接近的解決方案,但由于某種原因沒有回傳任何東西:
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
result = []
placements = []
self.solveNQueensR(n, 0, placements, result)
return result
def solveNQueensR(self, n: int, row: int, placements: List[str], result: List[List[str]]):
if n == row:
result.append(placements)
else:
for i in range(n):
if self.isValid(row, i, placements):
placements = self.addQueen(n, i, placements)
self.solveNQueensR(n, row 1, placements, result)
placements.pop(-1)
return None
def addQueen(self, n: int, col: int, placements: List[str]):
string = ('.' * col) 'Q' ('.' * (n - col - 1))
placements.append(string)
return placements
def isValid(self, rowToPlace: int, col: int, placements: List[str]):
for i, row in enumerate(placements):
queen = row.index('Q')
if queen == col or abs(queen - col) == rowToPlace - i:
return False
return True
出于某種原因,這會輸出[[],[]]. 如果您列印結果,您可以看到結果在某個時間點實際上是正確的,但我相信正在發生的事情是它附加placements到結果,然后這一行placements.pop(-1)正在修改放置,從而影響結果。我該如何防止這種情況?我嘗試這樣做placements = placements[:-1],但這只是破壞了它。
uj5u.com熱心網友回復:
我相信發生的事情是它附加
placements到results然后這條線placements.pop(-1)正在修改placements,從而影響結果。
確實是這個原因。在整個程序中,placements指的是一個單一的串列。永遠不會為它創建新的串列實體,因此每次result.append(placements)執行時,result都會收到對同一串列的參考。
一種解決方案是獲取副本placements并將副本附加到results. 這樣您就可以確定附加的內容之后永遠不會改變:
result.append(placements[:])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490990.html
