使用回溯和递归的 N 皇后问题中的错误

Posted

技术标签:

【中文标题】使用回溯和递归的 N 皇后问题中的错误【英文标题】:Error in N Queens Problem using Backtracking and Recursion 【发布时间】:2021-05-24 09:21:49 【问题描述】:

我首先实现了一个零矩阵,表示棋盘的所有位置都是初始可用的

n=int(input())
answer=[]
restrictedIndices=[[0 for i in range(n)] for j in range(n)]
dp(n,0,restrictedIndices,answer)

然后我实现了三个函数来填充受限索引

def columnFill(restrictedIndices,row,column,n):
    o=column
    restrictedIndices[row][o]=1
    while o+1<n:
        o+=1
        restrictedIndices[row][o]=1
    o=column
    while o-1>=0:
        o-=1
        restrictedIndices[row][o]=1    
    o=column
    return restrictedIndices


def rowFill(restrictedIndices,row,column,n):
    o=row
    restrictedIndices[o][column]=1
    while o+1<n:
        o+=1
        restrictedIndices[o][column]=1
    o=row
    while o-1>=0:
        o-=1
        restrictedIndices[o][column]=1
    o=row    
    return restrictedIndices


def diagonalFill(restrictedIndices,row,column,n):
    o=row
    p=column
    restrictedIndices[o][column]=1
    while o+1<n and p+1<n:
        o+=1
        p+=1
        restrictedIndices[o][p]=1
    o=row
    p=column
    while o-1>=0 and p+1<n:
        o-=1
        p+=1
        restrictedIndices[o][p]=1
    o=row
    p=column
    while o+1<n and p-1>=0:
        o+=1
        p-=1
        restrictedIndices[o][p]=1
    o=row
    p=column
    while o-1>=0 and p-1>=0:
        o-=1
        p-=1
        restrictedIndices[o][p]=1    
    o=row
    p=column
    return restrictedIndices

然后是递归函数

def dp(n,row,restrictedIndices,answer):
    print(restrictedIndices)
    if row==n:
        print("yes i got a solution")
        return -1
    print(restrictedIndices)
    for i in range(n):
        if restrictedIndices[row][i]==1:
            print("rejected",(row,i))
            continue
        
        else:
            x=[i for i in restrictedIndices]
            print(row,i)
            columnFill(restrictedIndices,row,i,n)
            rowFill(restrictedIndices,row,i,n)
            diagonalFill(restrictedIndices,row,i,n)
            dp(n,row+1,restrictedIndices,answer)

我得到了错误的输出,我很想知道我们是否可以通过这种方式解决问题,以及是否有更好的选择。 我希望我可以通过解决方案了解递归和回溯是如何工作的

【问题讨论】:

【参考方案1】:

由于以下问题,这将不起作用:

answer 永远不会被填充:因此它只能是它的初始值,一个空列表 虽然您让dp 在找到解决方案时返回-1,但调用者永远不会检查此值。所以调用者不知道它并转到其for 循环的下一次迭代 当dp 的递归调用返回时,restrictedIndices 列表不会返回到之前的状态。这意味着在for 循环的下一次迭代中,条件[row][i]==1 将始终为True——在第一次迭代期间该单元格被设置为1。您应该确保for 循环的每次迭代都以与restrictedIndices 完全相同的状态开始。

我不会发布可行的解决方案,因为这在 Internet 上有大量文档,并且 Python 的递归解决方案也可以在 Stack Overflow 上找到:

eight queens problem in Python, Backtracking 8 Queens Python problems Solving the n-queen puzzle 8 Queens Solution in Python N Queens: backtracking solution implemented by Python generator

【讨论】:

非常感谢,先生!

以上是关于使用回溯和递归的 N 皇后问题中的错误的主要内容,如果未能解决你的问题,请参考以下文章

N-Queens 回溯/递归逻辑错误?

“自我”如何正确更新原始变量? N皇后问题中的递归/回溯(Python)

N皇后问题(递归回溯)

N皇后问题(回溯递归思想)

8皇后问题--回溯法 (循环递归)

递归回溯之八皇后问题详解