n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
非常经典的DFS算法
class Solution:
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
if n<1:
return
self.result = [] #存储结果
self.cols = set() #保存不能放的列的位置
self.pie = set() #保存不能放的对角线位置
self.na = set() #保存不能放的反对角线位置
self.DFS(n,0,[])
#return self.result
return self._generate_result(n)
def DFS(self, n, row, cur_state):
if(row>=n):
self.result.append(cur_state)
return
for col in range(n):
if col in self.cols or row+col in self.pie or row-col in self.na:
continue
self.cols.add(col)
self.pie.add(row+col)
self.na.add(row-col)
self.DFS(n,row+1,cur_state+[col])
self.cols.remove(col)
self.pie.remove(row+col)
self.na.remove(row-col)
def _generate_result(self, n):
board = []
for res in self.result:
for i in res:
board.append("."*i + "Q" + "." * (n-1-i))
return [board[i:i+n] for i in range(0, len(board), n)]
只统计解法的个数
class Solution:
def totalNQueens(self, n):
"""
:type n: int
:rtype: int
"""
if n<1:
return
self.result = 0 #存储结果
self.cols = set() #保存不能放的列的位置
self.pie = set() #保存不能放的对角线位置
self.na = set() #保存不能放的反对角线位置
self.DFS(n,0)
return self.result
def DFS(self, n, row):
if(row>=n):
self.result+=1
return
for col in range(n):
if col in self.cols or row+col in self.pie or row-col in self.na:
continue
self.cols.add(col)
self.pie.add(row+col)
self.na.add(row-col)
self.DFS(n,row+1)
self.cols.remove(col)
self.pie.remove(row+col)
self.na.remove(row-col)