繁体   English   中英

使用Python解决N个皇后(编码替代方法):

[英]Solving the N-queens using Python(Coding alternatives):

我尝试了以下代码。如果要进行任何修改,可以降低代码的复杂性。我使用了一个名为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()initialize()板时,请将所有值board['queen'][i]-1 您的主程序调用if placequeen(0,board):调用j每个值, if free(i,j,board):调用if free(i,j,board):检查board['queen'][i] == 0 最后一个检查对所有j都失败,因此free()返回False ,而placequeen从不添加placequeen因此返回False ,并且您的主程序甚至从未尝试过印刷电路板。

您的程序比所需的更为复杂:我认为您的字典根本不需要,您可以将各种数组作为单独的变量。 但是,您实际上并没有要求简化代码。 我不确定如何删除此非打印错误,但可以考虑将board['queen'][i]0而不是-1

我同意@RandomDavis的观点,您需要学习如何使用调试器。 我曾经用它来找到您指出的错误的原因,但其他原因可能仍然存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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