回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>这是我的python程序来解决8皇后问题。一切都在工作,除了最后一步打印解决的电路板。我使用递归/回溯来填充电路板,直到找到解决方案。保存解决方案的board对象是<code>self</code>,它是对<code>b1</code>的引用,因此我假设<code>b1</code>,我初始化的原始board,将被更新以包含最终解决的board,并使用<code>printBoard</code>打印解决方案。但是,<code>b1</code>没有被更新,当我出于某种未知的原因打印它时,它持有一个失败的电路板。你知道吗</p>
<p>编辑:在<code>solve</code>中添加<code>placeQueen</code></p>
<pre><code>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()
</code></pre>
<p>我知道我的实际解算器正在工作,因为当我添加一个<code>printBoard</code>如下:</p>
<pre><code>if col == -1:
self.printBoard()
return True
</code></pre>
<p>在<code>solve</code>方法中,打印已求解的电路板。简而言之,为什么board的<code>self</code>实例没有更新<code>b1</code>?你知道吗</p>