0

我为 n-queens 问题尝试了这个 python 代码,但没有得到任何输出。有人能告诉我哪里出错了吗?

def initialize(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():
   for row in sorted(board['queen'].keys()):
      print((row,board['queen'][row]))
def free(i,j):
   return(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['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['queen'][i]=-1
   board['row'][i]=0
   board['col'][j]=0
   board['nwtose'][j-i]=0
   board['swtone'][j+i]=0
def placequeen(i):
   n=len(board['queen'].keys())
   for j in range(n):
      if free(i,j):
         addqueen(i,j)
         if i==n-1:
            return(True)
         else:
            extendsoln=placequeen(i+1)
         if extendsoln:
            return(True)
         else:
            undoqueen(i,j)
     else:
        return(False)
board={}
n=int(input("How many queens?"))
initialize(n)
if placequeen(0):
       printboard()

printboard() 函数中的打印语句不起作用。谁能帮我推理为什么?

4

2 回答 2

0

它不打印任何内容的原因是您的 if 语句执行为 False,而您希望它为 True。

使用此代码为您自己结帐(添加了一个 else 块来捕获输出 if 语句为 False):

board={}
n=int(input("How many queens?"))
initialize(n)
if placequeen(0):
    print("Output == True")
    printboard()
else: #<< added for debug purposes
    print("Output == False")
    printboard()

原因及解决方法

您的条件执行为 False 的原因可能是因为在您的 placequeen() 函数中,您在 for 循环中使用了“返回”语句。

您需要调试此函数()并检查为什么它(几乎)总是返回注意(=False)。

您的问题的根本原因在于 placequeen() 函数。希望这将使您走上修复它的正确道路!

于 2019-09-12T09:36:37.800 回答
0

复制并运行您的代码并收到以下错误:

IndentationError: unindent 不匹配任何外部缩进级别

它在谈论你的 placequeeen 函数中的最后一个“else-statement”

请复制并重试:

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

您使用的是什么编辑器/IDE?我建议使用 pycharm,在我不得不运行代码之前它给了我这个错误。

让我知道这是否解决了您的问题!

于 2019-09-10T09:03:35.083 回答