51. N-Queens N 皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 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 皇后相关推荐
- Eight Queens(八皇后)
八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个 ...
- 【LeetCode】51和52.N皇后
N皇后 题目描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解 ...
- 1222 可以攻击国王的皇后
题目描述: 在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」. 「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示. 「黑皇后」的行棋 ...
- 【算法进阶】回溯(backtracking)基本逻辑,以及常见回溯问题(全排列、解数独、八皇后)
文章目录 一.引言 二.回溯法基本逻辑 三.回溯法代码模板 三.回溯法常见问题 3.1 组合 逻辑 代码 3.2 子集 逻辑 代码 3.3 子集Ⅱ 逻辑 代码 3.4 分割回文串 逻辑 代码 3.5 ...
- python DFS深度优先搜索及N皇后问题求解
DFS可谓是算法里的一个大头,不懂DFS都不敢承认自己学过数据结构.今天菜鸡我要逆袭了,先从经典的N皇后问题搞起,试试DFS水深几尺[略加思索] 内容篇幅有点长,不想看我对DFS嗷嗷叫的朋友还是直接去 ...
- 八皇后问题 matlab,Matlab 递归求解八皇后问题
这是递归版本,随后会给出其他版本 function Queens % 8皇后问题的递归法求解 sol = 1; % 解的个数 queen = zeros(8); % 8*8的棋盘 saferows = ...
- 八皇后算法分析及源代码
[问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处 ...
- 2018 ucla计算机排名,2018福布斯最具价值美国大学排名:加州UCLA位列榜首!
对于美国留学的申请来说,也许大家在选校过程中都会比较倾向于USNEWS的院校排名榜.但是,怎样从多方面更多的了解你想要选择的学校呢?美国著名的权威财经杂志<福布斯>根据净价格.净债务.校友 ...
- 堆栈计算机的原理和实现
堆栈计算机的原理和实现 原书< Stack Computers: the new wave > (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这 ...
- NCURSES库的使用
可在http://download.csdn.net/source/942687处下载~~! NCURSES Programming HOWTO 第一章NCURSES 库简介 在使用电传终端作为计算机 ...
最新文章
- 区分HPUX是Itanium还是PA-RISC
- php JSON数据格式化输出方法
- mysql 查看数据库占用空间的大小
- cocos2D(九)---- CCAction
- SQLite入门与分析(四)---Page Cache之事务处理(3)
- python turtle渐变色_如何在matplotlib中绘制渐变色线?
- PL/SQL中模拟EBS上下文
- 《电路分析导论(原书第12版)》一2.8 导体和绝缘体
- Android Broadcast 和 BroadcastReceiver的权限限制
- 解决eclipse打开报错:failed to create the java virtual ma
- HyperLPR车牌识别库代码分析(11)
- 普元eos运行环境下的逻辑流及页面流反编译工具
- 专门查英语单词的软件_查英语单词的工具
- Linux下进程通讯消息队列
- PHP从入门到精通 第3版pdf
- C语言函数字符型形参,char (*str)[ ]跟char *str[ ]作函数形参的区别
- 计算机D盘无法读取,D盘目录或文件被损坏且无法读取的愿意以及解决办法
- 计算机视觉可解释性——卷积神经网络中间层的可视化
- jquery中e.target是什么意思
- LOL自动走A和释放技能原理及安全防护
热门文章
- 关于mingw编译Qt时无法编译opengl es2(ANGLE)版本的问题
- 制作简单的2D物理引擎(零)
- [存档]Div+Css布局中经常使用的小技巧合集
- 各类环境渗透测试简述
- linux mint 蓝牙,Linuxmint19蓝牙连接的问题
- 深入浅出谈cuda 书_入门和基础——9本关于美学的书
- md文件编辑器_File Cabinet Pro for Mac(菜单栏文件管理器)
- Promise.all捕获错误
- 求和第一个算到最后一个周末求_Excel最全求和函数—sum家族系列
- 牛客网测试题--小a和黄金街道