题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上
,并且使皇后彼此之间不能相互攻击
。
不能相互攻击就是N个皇后两两不能同行同列同对角线
。
示例
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法
。
分析
可以利用 回溯法子集树 模板进行求解,每个节点是 n 分
,不是子集树里面的二分
,冲突检测
要注意,同行同列同对角线时剪枝
。
代码
class Solution:
def __init__(self):
self.x = []
self.X = []
self.n = 0
def conflict(self, k):
if k==0:
return False
for i in range(k):
if self.x[i] == self.x[k] or abs(i-k)==abs(self.x[i]-self.x[k]):
return True
return False
def backtrack(self, k):
if k>=self.n:
self.X.append(self.x[:])
else:
for i in range(self.n):
self.x.append(i)
if not self.conflict(k):
self.backtrack(k+1)
self.x.pop()
def numList2resList(self):
res = [[[0 for i in range(self.n)] for j in range(self.n)]for k in range(len(self.X))]
result = []
for i in range(len(self.X)):
for j in range(self.n):
for k in range(self.n):
res[i][j][k] = 'Q' if self.X[i][j] == k else '.'
for i in range(len(self.X)):
tmp = []
for j in range(self.n):
tmp.append(''.join(res[i][j]))
result.append(tmp[:])
return result
def solveNQueens(self, n):
self.n = n
self.backtrack(0)
return self.numList2resList()