问题:
题目来源:力扣(LeetCode)
难度:困难
分析:
回溯法。
经典的N皇后问题,回溯法。
需要注意的点有,N皇后如何确定主对角线和副对角线上没有皇后。通过观察可以发现,棋盘的主对角线上横纵坐标的差是定值且互不相同,副对角线上的横纵坐标的和是定值且互不相同。因此按行回溯,通过检查各列以及主副对角线的值,即可解决问题。
还有一点需要注意的是,回溯过程中是按行依次保存的皇后所在列的位置,输出时需要输出棋盘。
解决方法:
1:回溯法
#这里depth既是回溯深度也是棋盘的行数
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
if n == 0: return []
def backtrack(depth):
if depth == n:
res.append(path[:])
#按列寻找符合条件的位置
for i in range(n):
if cols[i] == False and hill_diagonals[depth + i] == False and dale_diagonals[depth - i] == False:
cols[i] = True
hill_diagonals[depth + i] = True
dale_diagonals[depth - i] = True
path.append(i)
backtrack(depth + 1)
cols[i] = False
hill_diagonals[depth + i] = False
dale_diagonals[depth - i] = False
path.pop()
cols = [False] * n
hill_diagonals = [False] * (2 * n - 1) #主对角线差是定值
dale_diagonals = [False] * (2 * n - 1) #副对角线和是定值
path = []
res = []
backtrack(0)
return [["." * i + "Q" + "." * (n - i - 1) for i in path ] for path in res]
主副对角线的规律如下图:
图片取自leetcode题解。
链接:https://leetcode-cn.com/problems/n-queens/solution/gen-ju-di-46-ti-quan-pai-lie-de-hui-su-suan-fa-si-/