Leetcode 51 N-Queens
阿新 • • 發佈:2020-10-25
題目介紹
求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
。