1. 程式人生 > 實用技巧 >Leetcode 51 N-Queens

Leetcode 51 N-Queens

題目介紹

N皇后問題的所有解法。

Examples

Input: 4
Output: [
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]

Solution

N皇后問題是一個標準的DFS問題,任意兩個皇后不能出現在同一行,同一列或者對角線上(45°135°)。針對Python,還需要考慮可變變數的問題。

對於同一行或者同一列,因為棋盤是N*N,所以只要使用一個visit陣列就可以標識是否出現過。

下面是一個比較普通的方法:

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        visit = [0 for i in range(n)]
        ans = []

        def helpfunc(i, res):
            if i == n:
                ans.append(res)
                return
            for k in range(n):
               # 檢查行列
                if not visit[k]:
                    p, q, m = i, k, k
                    # 檢查對角線
                    while p-1 >= 0:
                        if q-1 >= 0 and res[p-1][q-1] == 'Q':
                            break
                        if m+1 <= n-1 and res[p-1][m+1] == 'Q':
                            break
                        p -= 1
                        q -= 1
                        m += 1
                    else:
                        temp = ['.'] * n
                        temp[k] = 'Q'
                        visit[k] = 1
                        helpfunc(i+1, res+[''.join(temp)])
                        visit[k] = 0

        helpfunc(0, [])
        return ans

當然,也可以使用一個數組來表示對角線是否被使用。假設元素座標為[i,j],則對角線的值為i+j或者i-j