Leetcode题51、N皇后(Python题解)Google面试题

    科技2022-07-11  106

    问题:

    题目来源:力扣(LeetCode)

    leetcode51.N皇后

    难度:困难

    分析: 回溯法。 经典的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-/

    Processed: 0.019, SQL: 8