使用回溯和递归在 N Queens 问题中出错
Error in N Queens Problem using Backtracking and Recursion
我先实现了一个零矩阵表示棋盘的所有位置都是初始可用的
n=int(input())
answer=[]
restrictedIndices=[[0 for i in range(n)] for j in range(n)]
dp(n,0,restrictedIndices,answer)
然后我实现了三个函数来填充 restrictedIndices
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)
我得到了错误的输出,我很想知道我们是否可以通过这种方式解决问题,以及是否有更好的选择。
我希望我能通过解决方案理解递归和回溯是如何工作的
由于以下问题,这将不起作用:
answer
永远不会被填充:因此它只能是它的初始值,一个空列表
- 虽然在找到解决方案时让
dp
return -1,但调用者永远不会检查此值。所以调用者不知道它并进入其for
循环 的下一次迭代
- 当
dp
return 的递归调用时,restrictedIndices
列表不会 return 到其先前的状态。这意味着在 for
循环的下一次迭代中,条件 [row][i]==1
将始终为真——此单元格在第一次迭代期间被设置为 1。您应该确保 for
循环的每次迭代都以 restrictedIndices
. 完全相同的状态开始
我不会 post 一个有效的解决方案,因为这在互联网上有广泛的记录,Python 的递归解决方案也可以在 Stack Overflow 上找到:
- eight queens problem in Python,
- Solving the n-queen puzzle
- 8 Queens Solution in Python
- N Queens: backtracking solution implemented by Python generator
我先实现了一个零矩阵表示棋盘的所有位置都是初始可用的
n=int(input())
answer=[]
restrictedIndices=[[0 for i in range(n)] for j in range(n)]
dp(n,0,restrictedIndices,answer)
然后我实现了三个函数来填充 restrictedIndices
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)
我得到了错误的输出,我很想知道我们是否可以通过这种方式解决问题,以及是否有更好的选择。 我希望我能通过解决方案理解递归和回溯是如何工作的
由于以下问题,这将不起作用:
answer
永远不会被填充:因此它只能是它的初始值,一个空列表- 虽然在找到解决方案时让
dp
return -1,但调用者永远不会检查此值。所以调用者不知道它并进入其for
循环 的下一次迭代
- 当
dp
return 的递归调用时,restrictedIndices
列表不会 return 到其先前的状态。这意味着在for
循环的下一次迭代中,条件[row][i]==1
将始终为真——此单元格在第一次迭代期间被设置为 1。您应该确保for
循环的每次迭代都以restrictedIndices
. 完全相同的状态开始
我不会 post 一个有效的解决方案,因为这在互联网上有广泛的记录,Python 的递归解决方案也可以在 Stack Overflow 上找到:
- eight queens problem in Python,
- Solving the n-queen puzzle
- 8 Queens Solution in Python
- N Queens: backtracking solution implemented by Python generator