2016-12-27 171 views
0

我尝试了下面的代码。如果有任何修改可以做出来,可以降低代码的复杂性。我使用了名为board的嵌套字典。使用Python解决N皇后问题(编码方案):

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,但没有得到输出。 凡excatly我要去错了???

感谢

+0

欢迎堆栈溢出。您似乎需要学习如何使用调试器逐行执行代码,这可能使您可以轻松查明所遇问题的性质和位置。对于所有的意图和目的,使用调试器都是任何程序员都需要的知识。有关更多信息,请参阅[如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

回答

0

当您在initialize()初始化板你board['queen'][i]设置所有值-1。你的主程序调用if placequeen(0,board):这对于j每个值调用if free(i,j,board):,检查board['queen'][i] == 0。最后一次检查失败,所有j,所以free()返回False,并且placequeen永远不会添加一个女王,因此返回False,并且您的主程序甚至不会尝试打印该板。

你的程序比需要的更复杂:我根本看不到你的字典,你可以将你的各种数组作为单独的变量。但是,您实际上并未要求简化代码。我不知道如何删除这个非印刷错误,但考虑设置board['queen'][i]0而非-1

我同意@RandomDavis,你需要学习如何使用调试器。我用一个来找出你所说错误的原因,但其他人可能仍然存在。

+0

谢谢先生。我不得不改变免费(i,j,板)功能。我删除了电路板['queen'] [i] == 0,然后输出显示在屏幕上。正如@RandomDavis所说,我确实遵循了这个代码的调试策略。 –