题目
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[“.Q..”, // 解法 1
“…Q”,
“Q…”,
“..Q.”],
[“..Q.”, // 解法 2
“Q…”,
“…Q”,
“.Q..”]
]
解释: 4 皇后问题存在两个不同的解法。
代码
class Solution:
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
res = []
final_ans = []
ans_list = [-1 for _ in range(n)]
final_ans = list(self.queens(n, final_ans, ()))
#final_ans里储存的是N皇后成功放置后的一个数字组成的元组,各个数字代表各行皇后所在的列数
for each_ans in final_ans:
final = []
for index in each_ans:
#构建最终答案,成为题目需要的形式
row = '.'*index +'Q'*1 + '.'*(n-index-1)
final += [row]
res.append(final)
return res
def queens(self, num, final_ans, state = ()):
for pos in range(num):
#pos指的是当前皇后应该放置的横坐标,也就是所在的列。
if not self.conflict(state, pos):
#产生当前皇后的位置信息
#如果只剩一个皇后没有放置
if len(state) == num-1:
yield (pos,)
#否则,把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。
#程序要从前面的皇后得到包含位置信息的元组(元组不可更改)
#并要为后面的皇后提供当前皇后的每一种合法的位置信息
#所以把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。
else:
for result in self.queens(num, final_ans, state+(pos,)):
yield (pos, ) + result
def conflict(self, state, nextX):
#nextY表示当前棋盘构造的长度,也就是下一个皇后应该落在的行的编号
nextY = len(state)
for i in range(nextY):
#遍历之前的行,state[i]表示他们所在的列数,i表示他们所在的行数
if abs(state[i]-nextX) in (0, nextY-i):
return True
return False