题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
解法1。DFS回溯
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
if n <= 0:
return []
row = []
col = [0]*n
dia1 = [0]*(2*n-1)
dia2 = [0]*(2*n-1)
res = []
self.dfs(n, 0, row, col, dia1, dia2, res)
return res
def dfs(self, n, index, row, col, dia1, dia2, res):
if index == n:
res.append(self.generateRes(n, row))
return
for i in range(n):
if col[i]==0 and dia1[index+i]==0 and dia2[index-i+n-1]==0:
row.append(i)
col[i]=1
dia1[index+i]=1
dia2[index-i+n-1]=1
self.dfs(n, index+1, row, col, dia1, dia2, res)
row.pop()
col[i]=0
dia1[index+i]=0
dia2[index-i+n-1]=0
return
def generateRes(self, n, row):
if len(row)==n:
board = [['.' for _ in range(n)] for _ in range(n)]
for i in range(n):
board[i][row[i]] = 'Q'
fi=[]
for lst in board:
sub = ''
for c in lst:
sub += c
fi.append(sub)
return fi