描述
N皇后问题是将n
个皇后放置在n*n
的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线)。给定一个整数n
,返回所有不同的N皇后问题的解决方案。每个解决方案包含一个明确的N皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
样例
样例 1:
输入:
n = 1
输出:
[["Q"]]
解释:
只有一种方案。
样例 2:
输入:
n = 4
输出:
[
// Solution 1
[".Q..",
"...Q",
"Q...",
"..Q."
],
// Solution 2
["..Q.",
"Q...",
"...Q",
".Q.."
]
]
解释:
有两种解决方案。
这一题还是比较有难度,首先要确定的是求所有解决方案,肯定是使用DFS来做。然后就要思考什么时候Q能够放置。Q不能放同一列,所有每列只能有一个Q。不能放对角线,这里要用数学的思维算一下,对角线上位置的坐标,要么和相等,要么差相等。可以自己在草稿纸上画一下。
代码如下:
class Solution:
"""
@param: n: The number of queens
@return: All distinct solutions
"""
def solveNQueens(self, n):
# write your code here
# 同一列不能有两个Q,对角线不能有两个Q。对角线上坐标的和or差一样
visited={
'col':set(),
'sum':set(),
'dif':set()
}
self.results=[]
if n==0:
return []
self.dfs(n,[],visited)
return self.results
def dfs(self,n,permutation,visited):
if n==len(permutation):
self.results.append(self.draw(n,permutation))
# 当前是第几行
row=len(permutation)
# 搜索每一列
for col in range(n):
if not self.isvalid(row ,col,visited):
continue
permutation.append(col)
visited['col'].add(col)
visited['sum'].add(row+col)
visited['dif'].add(row-col)
self.dfs(n,permutation,visited)
visited['col'].remove(col)
visited['sum'].remove(row + col)
visited['dif'].remove(row - col)
permutation.pop()
def isvalid(self,row,col,visited):
if col in visited['col']:
return False
if col+row in visited['sum']:
return False
if row-col in visited['dif']:
return False
return True
def draw(self,n,permutation):
results=[]
for i in range(n):
s=''
for j in range(n):
if permutation[i]==j:
s=s+'Q'
else:
s=s+'.'
results.append(s)
return results
nums =4
s = Solution()
print(s.solveNQueens(nums))