在dfs问题中,最经典的问题莫过于8皇后问题(是吗? ),对于何为8皇后问题,在这里就不做赘述(你就是懒 )。在本篇博客中,我们将就8皇后问题的变种问题n皇后问题进行分析。

首先上题目 题目链接Acwing 棋盘问题

给定一个 N×N 的棋盘,请你在上面放置 N 个棋子,要求满足:每行每列都恰好有一个棋子
每条对角线上都最多只能有一个棋子1   2   3   4   5   6-------------------------
1 |   | O |   |   |   |   |-------------------------
2 |   |   |   | O |   |   |-------------------------
3 |   |   |   |   |   | O |-------------------------
4 | O |   |   |   |   |   |-------------------------
5 |   |   | O |   |   |   |-------------------------
6 |   |   |   |   | O |   |-------------------------
上图给出了当 N=6 时的一种解决方案,该方案可用序列 2 4 6 1 3 5 来描述,该序列按顺序给出了从第一行到第六行,每一行摆放的棋子所在的列的位置。请你编写一个程序,给定一个 N×N 的棋盘以及 N 个棋子,请你找出所有满足上述条件的棋子放置方案。输入格式
共一行,一个整数 N。输出格式
共四行,前三行每行输出一个整数序列,用来描述一种可行放置方案,序列中的第 i 个数表示第 i 行的棋子应该摆放的列的位置。这三行描述的方案应该是整数序列字典序排在第一、第二、第三的方案。第四行输出一个整数,表示可行放置方案的总数。数据范围
6≤N≤13

这题比起8皇后问题增加了一点难度,就在于需要对于前三种答案进行输出。(但其实也没难多少)因此我们需要用到一个数组来暂时存下我们的前三个答案。

在看代码之前,我们需要了解一个芝士点(芝士?哪有芝士? )
1、在某条主对角线上,行坐标减列坐标的值是一个常量(在下方代码中体现为i+j-2为定值,至于为什么减2,是因为减2后和的最小值为0,方便)
2、在某条副对角线上,行坐标加列坐标的值是一个常量(在下方代码中体现为n - 1 + i - j,理由同上,最小值为0,方便嘛)

上代码!!!!!

#include<iostream>      //不用解释吧
using namespace std;    //也不要解释吧
int n;   //同上
int a[15][15];  //这是棋盘
int cl[15];  //检查同一列有没有放棋子,没放就是0
int cd[30];  //检查主对角线
int cdl[30];  //检查副对角线
int p[15];  //用来暂时存下当前答案
int ans;  //存下方案总数,即答案void dfs(int i)  //i代表第i行
{if (i > n)如果搜索完每一行了{ans++;  //答案总数加一if (ans <= 3)  //如果答案序号小于3{for (int i = 1; i <= n; i++)   //输出方案的具体情况{cout << p[i] << ' ';}cout << endl;}return;  //搜索完啦,返回上一个情况吧}for (int j = 1; j <= n; j++)  //搜索这一行的每一个数据看符不符合要求{if (!cl[j] && !cd[i + j - 2] && !cdl[n - 1 + i - j])  //如果符合{p[i] = j;   //记下第i行是第j个放下了棋子cl[j] = 1;   //下面三行用来记录现在这个棋子的列,对角线都已经不能再放棋子了cd[i + j - 2] = 1;cdl[n - 1+i - j]=1;dfs(i + 1);  //这一行放完了不能再放了,开始在这第i行第j个放下棋子的前提下搜索下一行cl[j] = 0;  //搜索完第i行第j列放棋子的所有后续情况后,拿走,时光回溯,看看这第i行还有没有其它格子可以放棋子cd[i + j - 2] = 0;cdl[n - 1 + i - j] = 0;p[i] = 0;}}
}int main()
{cin >> n; //输入dfs(1);  //调用dfs函数搜索第一行cout << ans; //输出答案个数return 0;  //收工,睡觉去啦
}

输入样例

6

输出样例

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

到这里,n皇后问题就这么解决啦,很简单是不是(哪有?爬! )

作者:Avalon Demerzel,是个正在不断努力学习的小白,如果觉得博客不错,就来个三连吧(点个赞也行)。让我们一起进步。

【DFS】n皇后问题(代码逐句分析)相关推荐

  1. 【动态规划】01背包问题(c++代码逐句分析)

    01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题.如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些 ...

  2. 【算法模板】dfs 八皇后问题

    1.前言 本文将以经典的八皇后问题来解析dfs的主要思想. 2.题目 题目出处:活动 - AcWing 3.思路讲解 dfs的思想暗含树的历遍,主要步骤为: 判断是否搜索完毕---历遍寻找符合条件的元 ...

  3. 水洼数 DFS 蓝桥杯 java代码

    水洼数 DFS 蓝桥杯 java代码 有一个大小为N * M的院子,雨后积起了水,八连通的积水被认为是连在一起的,请求出园子里面总共有多少水洼 限制条件 N, M <=100 10 12 W.. ...

  4. 回溯法求解N皇后问题及其时间复杂度分析

    回溯法求解N皇后问题及其时间复杂度分析 一.回溯法简介 1. 什么是回溯法? 2. 回溯法的时间复杂度分析 蒙特卡罗方法 蒙特卡罗方法在回溯法求解时间复杂度中的应用 二.回溯法求解N皇后问题 1. 回 ...

  5. Python数据分析系列(2)——美国纽约皇后区空气质量分析

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 天善智能社区地址:https://www. ...

  6. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  7. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  8. Blueprint代码详细分析-Android10.0编译系统(七)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  9. Rust 阴阳谜题,及纯基于代码的分析与化简

    Rust 阴阳谜题,及纯基于代码的分析与化简 雾雨魔法店专栏 https://zhuanlan.zhihu.com/marisa 来源 https://zhuanlan.zhihu.com/p/522 ...

  10. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

最新文章

  1. Nhibernate常见的错误
  2. nvm卸载node_nvm-node版本管理工具
  3. C# Soap调WebService
  4. url地址传参中文乱码处理
  5. ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作
  6. 红黑树 java代码实现
  7. 使用 redis 减少 秒杀库存 超卖思路 (转)
  8. matlab下载安装全教程
  9. C语言-C语言程序的结构
  10. 计算机网络和共享中心打不开,Win7系统网络和共享中心打不开如何解决
  11. 2010年度CSDN十大博客文章
  12. 自封装验证手机号码、邮箱格式、身份证号的工具
  13. 幼师计算机课是上什么,幼师面试 鱼在天空飞,鸟在水里游是小班课程,还是中班,大班的课程...
  14. 最新PESCMS Ticket客服工单系统源码+全新的设计理念
  15. 用JS将两个数组的数据合并成一个数组对象
  16. Python学习1--Python基础
  17. 题解 UVA109 【SCUD Busters】
  18. Redhat linux常用命令(全)
  19. 云队友丨滴滴程维的烧钱大战
  20. 创建自己的手册 um命令

热门文章

  1. WebApi的调用-1.前端调用
  2. 官方client php api接口日记
  3. AppCan入门教程
  4. Android 实现全屏、无标题栏
  5. 转换成CSV文件、Word、Excel、PDF等的方法--读取CSV文件的方法
  6. DirectAdmin面板在线解压缩的.tar.gz文件
  7. 定制.NET GridView的长文本显示表格
  8. 如何打开浏览器的TLS 1.1 TLS 1.2支持
  9. 【路由和交换之H3C自导自演】
  10. The way to Go(5): 文件名、关键字与标识符