Leetcode.51.N皇后
阿新 • • 發佈:2018-12-28
51.N皇后
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
上圖為 8 皇后問題的一種解法。
給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。
每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該方案中 ‘Q’ 和 ‘.’ 分別代表了皇后和空位。
示例:
輸入: 4 輸出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解釋: 4 皇后問題存在兩個不同的解法。
根據《python基礎教程第三版》利用生成器可以解決這個問題。
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
def conflict(state,nextX):
'''
檢測是否有衝突
'''
nextY = len(state)
for i in range(nextY):
if abs(nextX-state[i]) in (0,nextY-i):
return True
return False
def quenes(num=8,state=()):
'''
生成一個元素是包含n皇后位置的元組的迭代器
'''
for pos in range(num):
if not conflict( state,pos):
if len(state) == num-1:
yield (pos,)
else:
for result in quenes(num,state+(pos,)):
yield (pos,) + result
def prettyprint(solution):
'''
對於一個可行路線按照標準輸出
'''
def line(pos,length=len(list(solution))):
return '.'*(pos) + 'Q' + '.'*(length-pos-1)
pic = []
for pos in solution:
pic.append(line(pos))
return pic
def prettyprintall(solutions):
'''
將所有可行路線按照標準輸出
'''
pic = []
for solution in solutions:
pic.append(prettyprint(solution))
return pic
return prettyprintall(quenes(n))