Leetcode 52:N皇后 II(超詳細的解法!!!)
阿新 • • 發佈:2018-12-15
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
上圖為 8 皇后問題的一種解法。
給定一個整數 n,返回 n 皇后不同的解決方案的數量。
示例:
輸入: 4
輸出: 2
解釋: 4 皇后問題存在如下兩個不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解題思路
使用之前問題的方法Leetcode 51:N皇后(最詳細的解法!!!)
class Solution:
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
row = [0 for i in range(n)]
def generateBoard(m, row):
board = [str() for i in range(n)]
for i in range(m):
board[i] = row[ i]*'.' + 'Q' + (m-row[i]-1)*'.'
return board
def isValid(k, row):
for i in range(k):
if row[i] == row[k] or abs(row[i] - row[k]) == k - i:
return False
return True
k, res = 0, 0
while k >= 0:
while row[k] < n and not isValid(k, row):
row[k] += 1
if row[k] < n:
if k == n - 1:
res += 1
row[k] += 1
else:
k += 1
else:
row[k] = 0
k -= 1
row[k] += 1
return res
由於這個問題和之前問題不一樣,我們只需要知道最後結果有多少個就可以了,並不需要知道具體的皇后擺放情況,所以我們可以通過建立set
的方式記錄兩個對角線
、行
上擺放皇后的情況,具體操作和之前Leetcode 51:N皇后(最詳細的解法!!!)計算座標的方法一致。
class Solution:
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
cols, diag1, diag2 = set(), set(), set()
def getResult(n, diag1, diag2, cols, row):
if row == n:
return 1
res = 0
for col in range(n):
d1 = row + col
d2 = row - col
if d1 in diag1 or d2 in diag2 or col in cols:
continue
diag1.add(d1)
diag2.add(d2)
cols.add(col)
res += getResult(n, diag1, diag2, cols, row + 1)
diag1.remove(d1)
diag2.remove(d2)
cols.remove(col)
return res
return getResult(n, diag1, diag2, cols, 0)
我將該問題的其他語言版本新增到了我的GitHub Leetcode
如有問題,希望大家指出!!!