使用Python解决N皇后问题(编码备选方案):

使用Python解决N皇后问题(编码备选方案):,python,python-3.x,Python,Python 3.x,我尝试了以下代码。如果需要进行任何修改,可以降低代码的复杂性。我使用了名为board的嵌套字典 def initialize(board,n): for key in ['queen','row','col','nwtose','swtone']: board[key] = {} for i in range(n): board['queen'][i] = -1 board['row'][i] = 0 board['col'][i] = 0

我尝试了以下代码。如果需要进行任何修改,可以降低代码的复杂性。我使用了名为board的嵌套字典

def initialize(board,n):
   for key in ['queen','row','col','nwtose','swtone']:
     board[key] = {}
   for i in range(n):
     board['queen'][i] = -1
     board['row'][i] = 0
     board['col'][i] = 0
   for i in range(-(n-1),n):
     board['nwtose'][i] = 0
   for i in range(2*n-1):
     board['swtone'][i] = 0

def printboard(board):
   for row in sorted(board['queen'].keys()):
     print((row,board['queen'][row]))

def free(i,j,board):
   return(board['queen'][i] == 0 and board['row'][i] == 0 and board['col'][j] == 0 and board['nwtose'][j-i] == 0 and board['swtone'][j+i] == 0)

def addqueen(i,j,board):
   board['queen'][i] = j
   board['row'][i] = 1 
   board['col'][j] = 1 
   board['nwtose'][j-i] = 1 
   board['swtone'][j+i] = 1 

def undoqueen(i,j,board):
   board['queen'][i] = -1
   board['row'][i] = 0 
   board['col'][j] = 0 
   board['nwtose'][j-i] = 0 
   board['swtone'][j+i] = 0


def placequeen(i,board):
   n = len(board['queen'].keys())
   for j in range(n):
        if free(i,j,board):
         addqueen(i,j,board)
         if i == n-1:
           return(True)
         else :
           extendsoln = placequeen(i+1,board)
         if extendsoln:
           return(True)
         else:
           undoqueen(i,j,board)
   else:
      return(False)


board = {}
n = int(input("How many Queens? "))
initialize(board,n)
if placequeen(0,board):
  printboard(board)
因此,当我尝试这段代码时,我能够给出输入,比如说4,但不能得到输出。 我到底错在哪里


谢谢

当您在
initialize()
中初始化电路板时,您将所有值
board['queen'][i]
设置为
-1
。主程序调用
if placequeen(0,board):
对于
j
的每个值调用
if free(i,j,board):
检查
board['queen'][i]==0
。最后一次检查对所有
j
都失败,因此
free()
返回
False
,并且
placequeen
从不添加皇后,因此返回
False
,主程序甚至从不尝试打印电路板

您的程序比需要的更复杂:我认为根本没有必要使用字典,您可以将各种数组作为单独的变量。然而,实际上您并没有要求简化代码。我不确定如何删除这个非打印错误,但是考虑将<代码>板[ [皇后] ] [i] <代码> > <代码> 0 >代码>而不是<代码> -1 < /C> >p>
我同意@RandomDavis的观点,即您需要学习如何使用调试器。我使用了一个来查找您所述错误的原因,但其他错误可能仍然存在。

欢迎使用堆栈溢出。看起来您需要学习如何使用调试器逐行地检查代码,这可能使您能够轻松地确定问题的性质和位置。对于任何程序员来说,使用调试器都是必需的知识。有关更多信息,请参阅。谢谢您,先生。我不得不改变自由(I,j,board)功能。我移除了电路板['queen'][I]==0,然后输出显示在屏幕上。正如@RandomDavis告诉我的,我确实遵循了这段代码的调试策略。