美文网首页
LintCode 33. N皇后问题

LintCode 33. N皇后问题

作者: CW不要无聊的风格 | 来源:发表于2020-07-06 14:58 被阅读0次

题目描述

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线)。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。


测试样例

输入:1

输出:

  [["Q"]]

输入:4

输出:

[

  // Solution 1

  [".Q..",

  "...Q",

  "Q...",

  "..Q."

  ],

  // Solution 2

  ["..Q.",

  "Q...",

  "...Q",

  ".Q.."

  ]

]


解题思路

使用DFS,每次对每行可用的列进行搜索,并使用一个list记录下对应已使用的列,这里记为used_cols,使用过的列按其所在行的顺序被加入到其中。每次搜索时,先判断下len(used_cols)是否等于n,如果是,则说明每一行都已选择过了,这时候需要生成解决方案,终止搜索。

此题的另一个重点在于对每一行可用的列进行搜索时,怎么判断某一列可用呢?

题目要求是 任意两个皇后不能位于同一行、同一列、同一斜线,对这个规则转换下,对应变为当前搜索的这一列没有被其它行使用过、当前当前行、列的和以及差都没有出现过。


代码

class Solution:

    """

    @param: n: The number of queens

    @return: All distinct solutions

    """

    def solveNQueens(self, n):

        if n == 1:

            return [["Q"]]

        boards = []

        self.dfs(n, [], boards)

        return boards

    def dfs(self, n, used_cols, boards):

        # used_cols里记录的是使用过的列

        # 每行对应有一个

        if len(used_cols) == n:

            boards.append(self.draw(n, used_cols))

            return

        # used_cols的长度可作为当前行数(从0开始)

        cur_row = len(used_cols)

        for col in range(n):

            if not self.is_valid(used_cols, cur_row, col):

                continue

            self.dfs(n, used_cols + [col], boards)

    def draw(self, n, cols):

        board = []

        for col in cols:

            row_str = ''.join(['Q' if c == col else '.' for c in range(n)])

            board.append(row_str)

        return board

    def is_valid(self, used_cols, cur_row, cur_col):

        """检查列数、行列和、行列差有无被使用过"""

        if cur_col in used_cols:

            return False

        for row, col in enumerate(used_cols):

            if cur_row + cur_col == row + col:

                return False

            if cur_row - cur_col == row - col:

                return False

        return True

相关文章

  • LintCode 33. N皇后问题

    题目描述 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列...

  • lintcode N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。给定一个整数n,返回所有不同的n皇后问题的解...

  • lintcode-N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。 给定一个整数n,返回所有不同的n皇后问题的...

  • lintcode 34 N皇后问题

    注意回溯 还有重置为零的步骤

  • 回溯之N皇后

    N皇后问题:在 n x n 的棋盘上放置 N 个皇后,使其不能相互攻击。 1. 问题分析 皇后相互攻击是指:在皇后...

  • 风云的ARTS打卡(第四周)

    第4周 Algorithm: N皇后问题 n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间...

  • LeetCode 52. N皇后 II(N-Queens II)

    52. N皇后 II N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之...

  • N皇后问题

    N皇后问题

  • 第16章 抽象深度优先搜索

    1、2n皇后问题 算法分析 与n皇后问题类似,如下是n皇后问题的分析,时间复杂度 按行继续比遍历,其中col[x]...

  • LeetCode 51. N皇后(N-Queens)

    51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 ...

网友评论

      本文标题:LintCode 33. N皇后问题

      本文链接:https://www.haomeiwen.com/subject/akgwqktx.html