繁体   English   中英

如何在递归python函数中存储矩阵列表数据?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM