經典的八皇後問題的一般情況,用Python怎樣來快速地解決呢?
注意點:
皇後用”Q”表示,空白用”.”表示例子:
輸入: n = 4
輸出:
[ ['.Q..',
'...Q',
'Q...',
'..Q.'],
['..Q.',
'Q...',
'...Q',
'.Q..']]
用三個數組來表示列、正反對角線的占用情況。一行行的遍歷,如果沒有沖突就把相應的位置置為占用,繼續處理下一行,並記錄改行的皇後放在了哪一列,當皇後都放完後,根據記錄的列號來拼出結果。進行回溯時要把占用的位置還回去。對角線位置的計算要小心(尤其是反對角線),可以把頂點帶進去計算驗證一下。
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
self.col = [False] * n
self.diag = [False] * (2 * n)
self.anti_diag = [False] * (2 * n)
self.result = []
self.recursive(0, n, [])
return self.result
def recursive(self, row, n, column):
if row == n:
self.result.append(list(map(lambda x: '.' * x + 'Q' + '.' * (n - 1 - x), column)))
else:
for i in range(n):
if not self.col[i] and not self.diag[row + i] and not self.anti_diag[n - i + row]:
self.col[i] = self.diag[row + i] = self.anti_diag[n - i + row] = True
self.recursive(row + 1, n, column + [i])
self.col[i] = self.diag[row + i] = self.anti_diag[n - i + row] = False
if __name__ == "__main__":
print(Solution().solveNQueens(5))