我正在用迭代解決N皇后問題(無遞歸)。我現在面臨的問題是重複的解決方案。例如4×4板有2種解決方案我打印4種解決方案,所以說我找到兩次相同的解決方案。在N皇后迭代解決方案中避免重複(不允許遞歸)
讓我進入代碼爲更好地概覽:
def solution(self):
queen_on_board = 0
for row in range(self.N):
for col in range(self.N):
self.board[row][col] = 'Q'
queen_on_board = queen_on_board + 1
print ("(row,col) : ", row, col)
squares_list = self.get_posible_safe_squares(row,col)
for square in squares_list:
for x,y in square.items():
if self.isTheQueenSafe(x,y):
self.board[x][y] = 'Q'
queen_on_board = queen_on_board + 1
print ("Queen on board", queen_on_board)
if queen_on_board == 4:
self.print_the_board()
self.reset_the_board()
queen_on_board = 0
所以你可以看到我會在每一個行列數。這個特定的實現給了我4個解決方案2是相同的。
(row,col) : 0 1
Queen on board 4
['.', 'Q', '.', '.']
['.', '.', '.', 'Q']
['Q', '.', '.', '.']
['.', '.', 'Q', '.']
(row,col) : 0 2
Queen on board 4
['.', '.', 'Q', '.']
['Q', '.', '.', '.']
['.', '.', '.', 'Q']
['.', 'Q', '.', '.']
(row,col) : 1 0
Queen on board 4
['.', '.', 'Q', '.']
['Q', '.', '.', '.']
['.', '.', '.', 'Q']
['.', 'Q', '.', '.']
(row,col) : 2 0
Queen on board 4
['.', 'Q', '.', '.']
['.', '.', '.', 'Q']
['Q', '.', '.', '.']
['.', '.', 'Q', '.']
我想避免重複。如果有人能指引我走向正確的方向,那將會很棒。
get_posible_safe_squares()方法在女王可能安全的電路板中查找可能的方塊。
def get_posible_safe_squares(self, row, col):
ret = []
for i in range(self.N):
for j in range(self.N):
if i != row and j !=col:
if i + j != row + col and i - j != row - col:
d = { i:j }
ret.append(d)
return ret
大多數搜索算法維護已經探索的一組狀態以避免此問題。你應該這樣做。 – Gene
什麼是'squares_list'?它的名字表明它是一個正方形列表,但是它的元素有一個'item'方法,它本身返回一個正方形列表,所以你可以添加關於這個結構的信息嗎?你的代碼可以做一些評論... – trincot
事實上,所有這些委員會4只是一個解決方案的旋轉。很難說實際上出了什麼問題,但是由於你任意地放置了皇后,我猜'get_posible_safe_squares'會返回任意位置。例如。將女王放在'(x,y)'處,安全正方形包含'(a,b),(c,d),(e,f)'。在(a,b)'放置一個皇后,安全的正方形將是'(x,y),(c,d),(e,f)'。 – Paul