[英]How to change this recursive function (return a list of paths for a 3X3 matrix) into iterative function in Python 2.7?
[英]How to store matrix list data in recursive python function?
我正在尝试用递归函数解决 N_Queen 问题。 我的代码如下所示。 问题是我无法将可接受的解决方案存储在列表中。 我可以看到在调试时出现了所有正确的答案,但是这些答案不能存储在递归函数之外的列表中。 我希望可接受的解决方案可以存储在一个列表中,并继续递归以获得下一个正确答案。 但是附加的解决方案总是在变化。
通过导入copy和deepcopy,我已经解决了这个问题,但它仍然令人困惑。 好像别人不用deepcopy就可以存储纯列表结果,但是我的矩阵列表是不能接受的。
谢谢。
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 比你附加它的时间
我目前不知道如何解决这个问题,但是当我发现我会对此进行编辑或评论
终于找到问题了,抱歉久等了。
在 line 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.