我正在尝试用递归函数解决N_Queen问题。代码如下所示。问题是我不能将可接受的解决方案存储在列表中。我可以看到在调试时出现了所有正确的答案,但是这些答案不能存储在递归函数之外的列表中。我希望可以接受的解决方案可以存储在一个列表中,并保持递归下一个正确的答案。但是附加的解总是在变化。
通过导入copy和deepcopy,我已经解决了这个问题,但它仍然令人困惑。似乎其他人可以存储纯列表结果而不需要deepcopy,但我的矩阵列表是不可接受的。
THX .
def NQueens(self, n: int) -> int:
res = []
board = [['.' for _ in range(n)] for _ in range(n)]
def backtrack(board,row):
if row == n:
res.append(board) # **this is the confusing part**
return
for col in range(n):
if not isvalid(board,row,col):
continue
board[row][col] = 'Q'
backtrack(board,row+1)
board[row][col] = '.'
def isvalid(board,row,col):
for i in range(row):
if board[i][col] == 'Q':
return False
for i in range(1,row+1):
if col - i >= 0 and board[row - i][col - i] == 'Q':
return False
for i in range(1,row+1):
if col + i < n and board[row - i][col + i] == 'Q':
return False
return True
backtrack(board,0)
return res
问题不在于你不能保存它,问题是在保存它之后你改变了board
的值它们是相连的所以它们都改变了所以,当你最终返回res
时,你最终返回的是board
的最后状态x倍,x是你添加它的次数
我目前不知道如何解决这个问题,但当我发现我会编辑或评论这个
我终于找到问题了,抱歉让你久等了
在board[row][col] = '.'
行中没有这样的条件,我的意思是它总是会发生,所以当你在回溯后放一个皇后时,你会毫无例外地删除它。
我改变了它,所以它会使return true
声明,如果实现放置所有的皇后,所以当回溯时,它不会删除它们,如果它找到一个解决方案。
我将保留工作代码,注释我所更改的内容,在这里:
def NQueens(n: int) -> int:
board = [['.' for _ in range(n)] for _ in range(n)]
def backtrack(board,row):
#If all queens are placed then return true
if row >= n:
return True
for col in range(n):
#if it is valid place the queen and try to place the next queen on the next row
if isvalid(board,row,col):
board[row][col] = 'Q'
if backtrack(board,row+1) == True:
return True
#if placing the queen was not the way to the solution remove the queen
board[row][col] = '.'
#if the queen can't be placed in any column in this row return false
return False
def isvalid(board,row,col):
for i in range(row):
if board[i][col] == 'Q':
return False
for i in range(1,row+1):
if col - i >= 0 and board[row - i][col - i] == 'Q':
return False
for i in range(1,row+1):
if col + i < n and board[row - i][col + i] == 'Q':
return False
return True
backtrack(board,0)
return board #directly return board, res was innecesary