1. 程式人生 > >Leetcode.51.N皇后

Leetcode.51.N皇后

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))