【DFS】n皇后问题(代码逐句分析)
在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皇后问题(代码逐句分析)相关推荐
- 【动态规划】01背包问题(c++代码逐句分析)
01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题.如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些 ...
- 【算法模板】dfs 八皇后问题
1.前言 本文将以经典的八皇后问题来解析dfs的主要思想. 2.题目 题目出处:活动 - AcWing 3.思路讲解 dfs的思想暗含树的历遍,主要步骤为: 判断是否搜索完毕---历遍寻找符合条件的元 ...
- 水洼数 DFS 蓝桥杯 java代码
水洼数 DFS 蓝桥杯 java代码 有一个大小为N * M的院子,雨后积起了水,八连通的积水被认为是连在一起的,请求出园子里面总共有多少水洼 限制条件 N, M <=100 10 12 W.. ...
- 回溯法求解N皇后问题及其时间复杂度分析
回溯法求解N皇后问题及其时间复杂度分析 一.回溯法简介 1. 什么是回溯法? 2. 回溯法的时间复杂度分析 蒙特卡罗方法 蒙特卡罗方法在回溯法求解时间复杂度中的应用 二.回溯法求解N皇后问题 1. 回 ...
- Python数据分析系列(2)——美国纽约皇后区空气质量分析
感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 天善智能社区地址:https://www. ...
- .NET 11 个 Visual Studio 代码性能分析工具
原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- Blueprint代码详细分析-Android10.0编译系统(七)
摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...
- Rust 阴阳谜题,及纯基于代码的分析与化简
Rust 阴阳谜题,及纯基于代码的分析与化简 雾雨魔法店专栏 https://zhuanlan.zhihu.com/marisa 来源 https://zhuanlan.zhihu.com/p/522 ...
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...
最新文章
- Nhibernate常见的错误
- nvm卸载node_nvm-node版本管理工具
- C# Soap调WebService
- url地址传参中文乱码处理
- ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作
- 红黑树 java代码实现
- 使用 redis 减少 秒杀库存 超卖思路 (转)
- matlab下载安装全教程
- C语言-C语言程序的结构
- 计算机网络和共享中心打不开,Win7系统网络和共享中心打不开如何解决
- 2010年度CSDN十大博客文章
- 自封装验证手机号码、邮箱格式、身份证号的工具
- 幼师计算机课是上什么,幼师面试 鱼在天空飞,鸟在水里游是小班课程,还是中班,大班的课程...
- 最新PESCMS Ticket客服工单系统源码+全新的设计理念
- 用JS将两个数组的数据合并成一个数组对象
- Python学习1--Python基础
- 题解 UVA109 【SCUD Busters】
- Redhat linux常用命令(全)
- 云队友丨滴滴程维的烧钱大战
- 创建自己的手册 um命令