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

上图为 8 皇后问题的一种解法。

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例:

输入:4
输出:[[".Q..",  // 解法 1"...Q","Q...","..Q."],["..Q.",  // 解法 2"Q...","...Q",".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

提示:

  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

基于集合的回溯

为了判断一个位置所在的列和两条斜线上是否已经有皇后,使用三个集合 columns\textit{columns}columns、diagonals1\textit{diagonals}_1diagonals1​ 和 diagonals2\textit{diagonals}_2diagonals2​ 分别记录每一列以及两个方向的每条斜线上是否有皇后。

列的表示法很直观,一共有 NNN 列,每一列的下标范围从 000 到 N−1N-1N−1,使用列的下标即可明确表示每一列。

如何表示两个方向的斜线呢?对于每个方向的斜线,需要找到斜线上的每个位置的行下标与列下标之间的关系。

方向一的斜线为从左上到右下方向,同一条斜线上的每个位置满足行下标与列下标之差相等,例如 (0,0)(0,0)(0,0) 和 (3,3)(3,3)(3,3) 在同一条方向一的斜线上。因此使用行下标与列下标之差即可明确表示每一条方向一的斜线。

方向二的斜线为从右上到左下方向,同一条斜线上的每个位置满足行下标与列下标之和相等,例如 (3,0)(3,0)(3,0) 和 (1,2)(1,2)(1,2) 在同一条方向二的斜线上。因此使用行下标与列下标之和即可明确表示每一条方向二的斜线。

每次放置皇后时,对于每个位置判断其是否在三个集合中,如果三个集合都不包含当前位置,则当前位置是可以放置皇后的位置。

Code

 def solveNQueens(self, n: int) -> List[List[str]]:def generateBoard():board = list()for i in range(n):rows[queues[i]] = 'Q'board.append("".join(rows))rows[queues[i]] = '.'return boarddef backtrack(row: int):if row == n:board = generateBoard()solutions.append(board)else:for col in range(n):if not (col in columns or row - col in diagonal1 or row + col in diagonal2):queues[row] = colcolumns.add(col)diagonal1.add(row - col)diagonal2.add(row + col)backtrack(row + 1)columns.remove(col)diagonal1.remove(row - col)diagonal2.remove(row + col)solutions, queues, rows = list(), [-1] * n, ['.'] * ncolumns, diagonal1, diagonal2 = set(), set(), set()backtrack(0)return solutions

复杂度分析

  • 时间复杂度:O(N!)O(N!)O(N!),其中 NNN 是皇后数量。

  • 空间复杂度:O(N)O(N)O(N),其中 NNN 是皇后数量。空间复杂度主要取决于递归调用层数、记录每行放置的皇后的列下标的数组以及三个集合,递归调用层数不会超过 NNN,数组的长度为 NNN,每个集合的元素个数都不会超过 NNN。

51. N-Queens N 皇后相关推荐

  1. Eight Queens(八皇后)

    八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个 ...

  2. 【LeetCode】51和52.N皇后

    N皇后 题目描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解 ...

  3. 1222 可以攻击国王的皇后

    题目描述: 在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」. 「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示. 「黑皇后」的行棋 ...

  4. 【算法进阶】回溯(backtracking)基本逻辑,以及常见回溯问题(全排列、解数独、八皇后)

    文章目录 一.引言 二.回溯法基本逻辑 三.回溯法代码模板 三.回溯法常见问题 3.1 组合 逻辑 代码 3.2 子集 逻辑 代码 3.3 子集Ⅱ 逻辑 代码 3.4 分割回文串 逻辑 代码 3.5 ...

  5. python DFS深度优先搜索及N皇后问题求解

    DFS可谓是算法里的一个大头,不懂DFS都不敢承认自己学过数据结构.今天菜鸡我要逆袭了,先从经典的N皇后问题搞起,试试DFS水深几尺[略加思索] 内容篇幅有点长,不想看我对DFS嗷嗷叫的朋友还是直接去 ...

  6. 八皇后问题 matlab,Matlab 递归求解八皇后问题

    这是递归版本,随后会给出其他版本 function Queens % 8皇后问题的递归法求解 sol = 1; % 解的个数 queen = zeros(8); % 8*8的棋盘 saferows = ...

  7. 八皇后算法分析及源代码

    [问题描述]  八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处 ...

  8. 2018 ucla计算机排名,2018福布斯最具价值美国大学排名:加州UCLA位列榜首!

    对于美国留学的申请来说,也许大家在选校过程中都会比较倾向于USNEWS的院校排名榜.但是,怎样从多方面更多的了解你想要选择的学校呢?美国著名的权威财经杂志<福布斯>根据净价格.净债务.校友 ...

  9. 堆栈计算机的原理和实现

    堆栈计算机的原理和实现 原书< Stack Computers: the new wave > (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这 ...

  10. NCURSES库的使用

    可在http://download.csdn.net/source/942687处下载~~! NCURSES Programming HOWTO 第一章NCURSES 库简介 在使用电传终端作为计算机 ...

最新文章

  1. 区分HPUX是Itanium还是PA-RISC
  2. php JSON数据格式化输出方法
  3. mysql 查看数据库占用空间的大小
  4. cocos2D(九)---- CCAction
  5. SQLite入门与分析(四)---Page Cache之事务处理(3)
  6. python turtle渐变色_如何在matplotlib中绘制渐变色线?
  7. PL/SQL中模拟EBS上下文
  8. 《电路分析导论(原书第12版)》一2.8 导体和绝缘体
  9. Android Broadcast 和 BroadcastReceiver的权限限制
  10. 解决eclipse打开报错:failed to create the java virtual ma
  11. HyperLPR车牌识别库代码分析(11)
  12. 普元eos运行环境下的逻辑流及页面流反编译工具
  13. 专门查英语单词的软件_查英语单词的工具
  14. Linux下进程通讯消息队列
  15. PHP从入门到精通 第3版pdf
  16. C语言函数字符型形参,char (*str)[ ]跟char *str[ ]作函数形参的区别
  17. 计算机D盘无法读取,D盘目录或文件被损坏且无法读取的愿意以及解决办法
  18. 计算机视觉可解释性——卷积神经网络中间层的可视化
  19. jquery中e.target是什么意思
  20. LOL自动走A和释放技能原理及安全防护

热门文章

  1. 关于mingw编译Qt时无法编译opengl es2(ANGLE)版本的问题
  2. 制作简单的2D物理引擎(零)
  3. [存档]Div+Css布局中经常使用的小技巧合集
  4. 各类环境渗透测试简述
  5. linux mint 蓝牙,Linuxmint19蓝牙连接的问题
  6. 深入浅出谈cuda 书_入门和基础——9本关于美学的书
  7. md文件编辑器_File Cabinet Pro for Mac(菜单栏文件管理器)
  8. Promise.all捕获错误
  9. 求和第一个算到最后一个周末求_Excel最全求和函数—sum家族系列
  10. 牛客网测试题--小a和黄金街道