【问题标题】:I am trying to solve N queens using backtracking. My solution is calculating values, however, there is a problem with return logic我正在尝试使用回溯解决 N 个皇后。我的解决方案是计算值,但是返回逻辑有问题
【发布时间】:2021-05-28 20:49:18
【问题描述】:

给定 n==4, 返回 [[[".","Q",".","."],[".",".",".","Q"],["Q",".",". ","."],[".",".","Q","."]],[[".",".","Q","."],["Q", ".",".","."],[".",".",".","Q"],[".","Q",".","."]]]

这是我的代码:

        def solveNQueens(self, n: int) -> List[List[str]]:
            ans=[]
            a=[['.' for j in range(n)] for i in range(n)]
           
            def valid(row, col):
                for i in range(n):
                    if a[i][col]=='Q':
                        return False
            
                for i in range(n):
                    if (row+i<n and col+i<n):
                        if a[row+i][col+i]=='Q':
                            return False
            
                for i in range(n):
                    if (row-i>=0 and col-i>=0):
                        if a[row-i][col-i]=='Q':
                            return False
            
                for i in range(n):
                    if (row-i>=0 and col+i<n):
                        if a[row-i][col+i]=='Q':
                            return False
                for i in range(n):
                    if (row+i<n and col-i>=0):
                        if a[row+i][col-i]=='Q':
                            return False
            
                return True
            
            def solver(rowNo):
                if rowNo == n:
                    
                  
                    ans.append(list(a))
                
                    return 
                
                for i in range(n):
                    if valid(rowNo, i):
                        a[rowNo][i]='Q'
                        solver(rowNo+1)
                        a[rowNo][i]='.'
                
                return 
            solver(0)
            return ans

当我每次都检查求解器函数中遇到的基本条件时,它正在正确地解决问题。但是,每次我更改 a 时,ans 变量中的附加数组都会更改引用。这导致 ans 数组包含两个以完全空的初始状态附加的 a 列表。我不明白为什么。请帮我理解。

【问题讨论】:

  • 很明显这是一个类内部的方法。我推荐使用@staticmethod,因为您没有使用self 参数。该方法与类实例无关

标签: python backtracking


【解决方案1】:

在线ans.append(list(a))
您正在复制一个列表,
但你应该复制其中的 8 个

因为a 看起来像这样

a = [
    ['.', '.', 'Q', ...],
    [...               ],
    ...
]

你必须复制a的每个元素
所以

ans.append([inner.copy() for inner in a])
# I also recommend to use `.copy()` instead `list(original)` to copy

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2015-08-19
    相关资源
    最近更新 更多