这是我解决8皇后问题的python程序。除了打印解决方案的电路板的最后一步之外,所有步骤都可以正常工作。我使用递归/回溯功能在木板上填入皇后,直到找到解决方案为止。拥有解决方案的电路板对象是self
,这是对的引用b1
,因此我假设将b1
初始化的原始电路板更新为包含最终解决的电路板,并使用来打印解决方案printBoard
。但是,b1
由于某种未知的原因,当我打印它时,它没有被更新并且持有一块失败的电路板。
编辑:增加了placeQueen
在solve
EMPTY = 0
QUEEN = 1
RESTRICTED = 2
class Board:
# initializes a 8x8 array
def __init__ (self):
self.board = [[EMPTY for x in range(8)] for y in range(8)]
# pretty prints board
def printBoard(self):
for row in self.board:
print(row)
# places a queen on a board
def placeQueen(self, x, y):
# restricts row
self.board[y] = [RESTRICTED for i in range(8)]
# restricts column
for row in self.board:
row[x] = RESTRICTED
# places queen
self.board[y][x] = QUEEN
self.fillDiagonal(x, y, 0, 0, -1, -1) # restricts top left diagonal
self.fillDiagonal(x, y, 7, 0, 1, -1) # restructs top right diagonal
self.fillDiagonal(x, y, 0, 7, -1, 1) # restricts bottom left diagonal
self.fillDiagonal(x, y, 7, 7, 1, 1) # restricts bottom right diagonal
# restricts a diagonal in a specified direction
def fillDiagonal(self, x, y, xlim, ylim, xadd, yadd):
if x != xlim and y != ylim:
self.board[y + yadd][x + xadd] = RESTRICTED
self.fillDiagonal(x + xadd, y + yadd, xlim, ylim, xadd, yadd)
# recursively places queens such that no queen shares a row or
# column with another queen, or in other words, no queen sits on a
# restricted square. Should solve by backtracking until solution is found.
def solve(self, col):
if col == -1:
return True
for i in range(8):
if self.board[i][col] == EMPTY:
temp = self.copy()
self.placeQueen(col, i)
if self.solve(col - 1):
return True
temp.board[i][col] = RESTRICTED
self = temp.copy()
return False
# deep copies a board onto another board
def copy(self):
copy = Board()
for i in range(8):
for j in range (8):
copy.board[j][i] = self.board[j][i]
return copy
b1 = Board()
b1.solve(7)
b1.printBoard()
我知道我的实际求解器正在工作,因为当我添加printBoard
如下代码时:
if col == -1:
self.printBoard()
return True
在该solve
方法中,打印出已解决的板。简而言之,为什么self
董事会实例未更新b1
?
我相信您的问题与在解决方法中重新定义自我有关,我什至不确定为什么要这样做。
有关更多详细信息,请参见此问题:用方法中的相同类型的另一个对象替换自身对象是否安全?
像执行操作那样重新分配自我不会重新分配“ b1”引用。因此,当您再次引用b1并执行printBoard时,您所引用的对象与“ self.printBoard()”将在求解完成时所引用的对象不同。
我会退后一步,问问自己,为什么您要取代自我,以及这样做有什么好处。您可能也不需要,也不应该这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句