按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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 皇后(回溯法)的更多相关文章

  1. 8皇后-----回溯法C++编程练习

    /* * 八皇后问题回溯法编程练习 * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击 * 也即,直线,垂直45度.135度方向不能出现两个皇后 * * copyright Michael ...

  2. js实现八皇后,回溯法

    八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...

  3. Leetcode之回溯法专题-51. N皇后(N-Queens)

    Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...

  4. Leetcode之回溯法专题-52. N皇后 II(N-Queens II)

    Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...

  5. 回溯法解决N皇后问题(以四皇后为例)

    以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...

  6. 实现n皇后问题(回溯法)

    /*======================================== 功能:实现n皇后问题,这里实现4皇后问题 算法:回溯法 ============================= ...

  7. HDU 2553 n皇后问题(回溯法)

     DFS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...

  8. 八皇后问题-回溯法(MATLAB)

    原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...

  9. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  10. 力扣算法题—052N皇后问题2

    跟前面的N皇后问题没区别,还更简单 #include "000库函数.h" //使用回溯法 class Solution { public: int totalNQueens(in ...

随机推荐

  1. JZOJ 5843.B

    \(Description\) 给定 \(n\) 个正整数序列 ,每个序列长度为 \(m\). 选择至少 \(1\) 个序列,在每个被选择的序列中选择一个元素,求出所有被选择的元素的 \(\gcd\) ...

  2. 【Linux SPI】RFID RC522 设备驱动

    一.概述 MFRC522 支持 SPI.I2C.UART 接口,我在某宝上购买了一个 SPI 接口的 RC522 模块.此笔记主要要是通过 RC522 模块学习 linux 中的 SPI 驱动,方便今 ...

  3. 跨平台C++ DLL导出宏

    #pragma once #if defined(__GNUC__) #define _DEPRECATED_ __attribute__((deprecated)) #define _FORCE_I ...

  4. Vulnhub:maskcrafter-1.1靶机

    kali:192.168.111.111 靶机:192.168.111.187 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  5. 以图搜图功能实现(windows10版)

    1,原理 存储:通过Core项目调取python接口,python通过使用towhee把图片转成向量存在milvus向量数据库中. 查询:通过Core项目调取python接口,python根据查询的图 ...

  6. iOS 常用第三方库及原理

    AFNetWorking SDWebImage MJRefresh Masonry YYModel IQKeyboardManger

  7. Openssh升级到9.2版本

    操作系统:centos7.6 1.安装依赖 yum install gcc gcc-c++ zlib-devel pam-devel openssl-devel make vim wget -y 备份 ...

  8. k8s 删除 node节点

    查看现有状态 [root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plan ...

  9. Activity 的窗口去头的方式

    1\窗口去头的第一种方式 public class SplashActivity extends Activity { @Override protected void onCreate(Bundle ...

  10. SVN 提交失败 Unexpected HTTP status 200 'OK' on 'PUT' request to

    提交SVN 时 提示  Commit Failed  Unexpected  HTTP status 200 'OK' on 'PUT' request to 旧的文件在SVN 上也无法删除,删除文件 ...