[英]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.