<p>使用Python的力量!我建议用你找到的解决方案,而不是用它们。这样,您就为所有解决方案创建了一个<em>生成器</em>。如果你真的需要的话,用这个符号列一个表是非常直接的</p>
<pre><code>[ solution for solution in solve(4) ]
</code></pre>
<p>或者只是</p>
<pre><code>list(solve(4))
</code></pre>
<p>编辑:</p>
<p>在您的情况下,<code>solve()</code>和<code>place_queen()</code>必须成为生成器。在<code>solve()</code>中,您应该做最后一件事:<code>return place_queen(board, 0, 0)</code>。这样你就可以返回一个生成器。(您也可以执行<code>for solution in place_queen(board, 0, 0): yield solution</code>,但这只会中继产生的值。)</p>
<p>在<code>place_queen()</code>而不是像<code>return place_queen(board, row+1, 0)</code>这样的返回中,您应该做<code>for solution in place_queen(board, row+1, 0): yield solution</code>这样的事情。</p>
<p>编辑2:</p>
<pre><code>#!/usr/bin/env python
def solve(n):
#prepare a board
board = [[0 for x in range(n)] for x in range(n)]
#set initial positions
return place_queen(board, 0, 0)
def place_queen(board, row, column):
"""place a queen that satisfies all the conditions"""
#base case
if row > len(board)-1:
yield board
#check every column of the current row if its safe to place a queen
while column < len(board):
if is_safe(board, row, column):
#place a queen
board[row][column] = 1
#place the next queen with an updated board
for solution in place_queen(board, row+1, 0):
yield solution
return
else:
column += 1
#there is no column that satisfies the conditions. Backtrack
for c in range(len(board)):
if board[row-1][c] == 1:
#remove this queen
board[row-1][c] = 0
#go back to the previous row and start from the last unchecked column
for solution in place_queen(board, row-1, c+1):
yield solution
def is_safe(board, row, column):
""" if no other queens threaten a queen at (row, queen) return True """
queens = []
for r in range(len(board)):
for c in range(len(board)):
if board[r][c] == 1:
queen = (r,c)
queens.append(queen)
for queen in queens:
qr, qc = queen
#check if the pos is in the same column or row
if row == qr or column == qc:
return False
#check diagonals
if (row + column) == (qr+qc) or (column-row) == (qc-qr):
return False
return True
import sys, pprint
sys.setrecursionlimit(10000)
for solution in solve(8):
pprint.pprint(solution)
</code></pre>