力扣51. N 皇后(回溯法)
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9
经典的回溯法问题,类似的需要回溯法的还有排列组合问题,一般是DFS+回溯来实现一个暴力搜索。
N皇后问题的有两个核心,一个是回溯,一个是对4个限定条件的判断(行、列、两条对角线)
1.回溯核心逻辑
void backtracking(element length,element end,element result,element set,int startIndex,...)
{
if(终止条件==end){
result.add(set); //将当前集合加到结果集中
for(i=startIndex;i<length;++i){
更新当前集合set;
backtracking(length,end,result,set,...); //往下一层遍历
还原当前集合set;
}
}
2.由于棋盘每行每列都会有一个皇后,我们可以选择一行一行确定或者一列一列遍历,这边我选择一行一行遍历。如果一行一行遍历,那么我们在遍历的过程中只需要记录列的皇后放置信息(因为每行放置了皇后之后就会进入下一层遍历,不会在该层停留,即已经确保了同一行只有一个皇后)、主对角线、副对角线的信息。
| (0,0) | (0,1) | (0,2) | (0,3) |
| (1,0) | (1,1) | (1,2) | (1,3) |
| (2,0) | (2,1) | (2,2) | (2,3) |
| (3,0) | (3,1) | (3,2) | (3,3) |
在一个棋盘上,假设某点坐标为( i , j )我们可以明显看出同一主对角线上i - j的值相同(注意不是|i - j|相同),同一副对角线上的i + j相同,据此我们可以用三个数组来快速判断某个位置能不能放入皇后。
1 class Solution {
2 public:
3 vector<int> column,ldiagonal,rdiagonal;
4 vector<vector<string>> result;
5 void backtracking(int n,vector<string> mmap,int row){
6 if (row==n){ //棋盘内已有n个皇后
7 result.push_back(mmap);
8 return;
9 }
10
11 for (int j=0;j<n;++j){
12 if (column[j]==0&&ldiagonal[row+j]==0&&rdiagonal[row-j+n-1]==0){
13 // cout<<row<<" and "<<j<<endl;
14 // cout<<row-j+n-1<<" "<<abs(row-j)<<endl;
15 mmap[row][j]='Q';
16 column[j]=1;
17 ldiagonal[row+j]=1;
18 rdiagonal[row-j+n-1]=1;
19 backtracking(n,mmap,row+1);
20 //回溯
21 rdiagonal[row-j+n-1]=0;
22 ldiagonal[row+j]=0;
23 column[j]=0;
24 mmap[row][j]='.';
25 }
26 }
27 return;
28 }
29 vector<vector<string>> solveNQueens(int n) {
30 //初始化
31 vector<string> initial;
32 for (int i=0;i<n;++i){
33 string temp;
34 for (int j=0;j<n;++j){
35 temp.push_back('.');
36 }
37 initial.push_back(temp);
38 }
39 for (int i=0;i<25;++i){
40 column.push_back(0);
41 rdiagonal.push_back(0);
42 ldiagonal.push_back(0);
43 }
44
45 backtracking(n,initial,0);
46
47 return result;
48 }
49 };
力扣51. N 皇后(回溯法)的更多相关文章
- 8皇后-----回溯法C++编程练习
/* * 八皇后问题回溯法编程练习 * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击 * 也即,直线,垂直45度.135度方向不能出现两个皇后 * * copyright Michael ...
- js实现八皇后,回溯法
八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...
- Leetcode之回溯法专题-51. N皇后(N-Queens)
Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...
- Leetcode之回溯法专题-52. N皇后 II(N-Queens II)
Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...
- 回溯法解决N皇后问题(以四皇后为例)
以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...
- 实现n皇后问题(回溯法)
/*======================================== 功能:实现n皇后问题,这里实现4皇后问题 算法:回溯法 ============================= ...
- HDU 2553 n皇后问题(回溯法)
DFS Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description ...
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- 算法——八皇后问题(eight queen puzzle)之回溯法求解
八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...
- 力扣算法题—052N皇后问题2
跟前面的N皇后问题没区别,还更简单 #include "000库函数.h" //使用回溯法 class Solution { public: int totalNQueens(in ...
随机推荐
- JZOJ 2022.07.18【提高组A】模拟
\(\text{T1}\) 很容易想到用 \(f_1 f_2 ... f_k\) 来表示第 \(n\) 项 发现重点关注指数即可,即我们要递推 \(f_1 ... f_k\) 对应的指数 递推涉及 \ ...
- JZOJ 2020.07.30【NOIP提高组】模拟
总结 本场比赛很不负责对待 暴力都没怎么打 一个半小时后才开始打题 很悲剧的只有 \(23+11+36=70\) 分 \(T1\) 4300. 装饰大楼 题目 略 思路 很无聊的找规律题 考场弃疗 \ ...
- Prufer序列 学习笔记
\(Prufer\) 序列 \(\texttt{definition}\) \(Prufer\) 序列序列可以将一个带标号 \(n\) 个结点的树用 \([1..n]\) 中的 \(n-2\) 个整数 ...
- git添加多账户(附带tortoiseGit多账号使用)
近期想在公司电脑上开发自己项目,但是电脑上已经配置过一个gitlab账户了,现在想要把自己的git账户也加进来,方便代码控制. 因为git用的比较少,还不太熟悉,都是网上找资料,边看边学边做,如有不对 ...
- Abp+Vue iis发布报错 HTTP Error 500.30 - ANCM In-Process Start Failure
1.项目发布到文件系统 2.IIS设置 ABP 如果使用时Net Core 跨平台,它依赖AspNetCoreModuleV2模块(没有的话需要先安装) 下载地址:https://dotnet ...
- C#神器"BlockingCollection"类实现C#神仙操作
前言 如果你想玩转C# 里面多线程,工厂模式,生产者/消费者,队列等高级操作,就可以和我一起探索这个强大的线程安全提供阻塞和限制功能的C#神器类 BlockingCollection简单介绍 微软介绍 ...
- 自己动手从零写桌面操作系统GrapeOS系列教程——6.电脑启动过程介绍
学习操作系统原理最好的方法是自己写一个简单的操作系统. 按一下电脑上的电源按钮,电脑就启动了,不一会儿电脑屏幕上就出现了登录界面或直接进入了桌面. 这是一个很日常的场景,但有时候会有个疑问:电脑内部是 ...
- 阿里云服务器ECS(Centos8)下安装和配置python3.8
1.安装依赖包: yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-dev ...
- 快速构建用户xlwings环境
一.安装python python-3.8.3-amd64.exe 二.准备文件requirements.txt 内容如下 安装失败需要切换国内镜像源 numpy==1.22.1 openpyxl== ...
- KU060板卡设计资料原理图第636篇:基于FMC的KU060高性能 PCIe 载板
基于FMC的KU060高性能 PCIe 载板 一.板卡概述 板卡主控芯片采用Xilinx 公司的 Kintex UltraScale系列FPGA XCKU060-2FFVA1156.板载 2 组 64 ...