1.前言

本文将以经典的八皇后问题来解析dfs的主要思想。

2.题目

题目出处:活动 - AcWing

3.思路讲解

dfs的思想暗含树的历遍,主要步骤为:

判断是否搜索完毕---历遍寻找符合条件的元素---递归进入下一层搜索---还原现场

我们可以先分析这个问题,发现皇后在每一行只能有一个,并且对角线,反对角线,每一排,每一列都只有一个皇后。

那么我们就可以从底层出发,遍历一排中的每一个元素,然后深入搜索下一排符合条件的元素,搜索到最后时,即是符合条件的第一个答案,回溯到第一排的下一个元素进行搜索。

由于dfs的灵魂是递归,所以递归的知识一定要掌握清楚。

4.代码实现

参照以下网格来理解代码:

该方法符合dfs的一般做法,当然算法是死的,人是活的,依照不同的题目,dfs的参数,形式等多种多样,不敢一板子把代码论死。要参照思想,具体情况具体分析,dfs最重要的便是顺序!!!

4.1 法1

#include <iostream>
using namespace std;
const int N = 20;//定义图(网格)
char path[N][N];//col记录每一列的皇后数,确保只有1个
//dg记录正对角线的皇后数,确保只有1个
//udg记录反对角线的皇后数,确保只有1个
bool col[N],dg[N],udg[N];//网格数n
int n;void dfs(int u)
{//搜索完毕,并且符合要求时打印if(u==n){for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){cout<<path[i][j];}cout<<endl;}cout<<endl;return;}//y代表y轴上的点for(int y = 0; y < n; y++){//如果一列里面没有元素,对角线上没有元素,那么放入皇后Q;if(!col[y]&&!dg[y+u]&&!udg[y-u+n]){path[u][y]='Q';col[y]=dg[y+u]=udg[y-u+n]=true;//皇后数+1,进入下一层搜索dfs(u+1);//回溯到原始状态col[y]=dg[y+u]=udg[y-u+n]=false;path[u][y]='.';}}}int main()
{cin>>n;//先初始化网格,再由dfs确定皇后位置for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){path[i][j]='.';}}//从第0层开始(初始皇后数为0)dfs(0);return 0;
}

这里解释一下对角线的判定:

由直线方程y=(±)x+b;

我们想要一条对角线上的皇后只有一个,而一条直线上,截距是一样的,b = y ± x ;

但是由于数组的下标没有负数, y - x 有可能是负数,所以加上n,映射成正数!

如果(u)dg[ b ] 为真,那么该直线上已经有一个皇后。

4.2 法2

#include <iostream>
using namespace std;
const int N = 20;
char path[N][N];
//判断行,列,对角线
bool row[N],col[N],dg[N],udg[N];
int n;void dfs(int x,int y,int s)
{//初始化条件if(y == n){x++;y = 0;}if(x == n){//搜素完毕,并且符合要求的条件if(s==n){for(int i = 0; i < n; i++){puts(path[i]);}puts(" ");}return;}//初始化网格path[x][y]='.';dfs(x,y+1,s);//思路同法1if(!row[y]&&!col[x]&&!dg[x+y]&&!udg[y-x+n]){row[y]=col[x]=dg[x+y]=udg[y-x+n]=true;path[x][y]='Q';dfs(x,y+1,s+1);row[y]=col[x]=dg[x+y]=udg[y-x+n]=false;path[x][y]='.';        }}
int main()
{cin>>n;dfs(0,0,0);return 0;
}

但是法2在效率上远不如法1,因为在初始化回溯时进行搜索,浪费了很多不必要的搜索,只有当x,y回溯到0时才真正起到作用。

举此法是为了说明dfs的灵活性。

5.结语

作为图论的必备入门技巧,要把握dfs的思想,并且熟练运用。

其实dfs更像一种循环,在if条件下找到不同层数的答案,完成搜索后继续下一个搜索,在不影响原来的数据的情况下输出答案。

后续会更新bfs的有关内容。

【算法模板】dfs 八皇后问题相关推荐

  1. 算法:递归-八皇后问题(回溯算法)

    1.问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯・贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不 ...

  2. python深度优先算法 八皇后_八皇后问题——DFS(深度优先搜索)

    八皇后问题,是在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 算法思路: 八皇后问题实质为一种深度优先(DFS)搜索问题. ...

  3. 数据结构与算法-- 八皇后问题(多种实现方案)

    八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想,想到了一个经典的算法题,八皇后问题: 题目:在8*8的国际象棋上摆放8个皇后,使得其互相不能攻击,即任意两个换后不能在同一行,同一列,或者同 ...

  4. LeetCode打卡 52八皇后Ⅱ53最大子序和54螺旋矩阵

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

  5. 你知道八皇后嘛?就是那个八皇后

    说起八皇后,其实这是一个古老而著名的问题.该问题是19世纪著名的数学家高斯1850年提出:在一个8*8国际象棋盘上,有8个皇后,每个皇后占一格:要求皇后之间不会出现相互"攻击"的现 ...

  6. 八皇后问题各种解法分析

    最近学习算法分析,突然对八皇后问题十分感兴趣,下面是我研究一段时间后的思想汇总.希望能够引起各位算法爱好者的共鸣,当然如果有什么遗漏之处希望互相交流. 一:回溯法 这种算法想必学习计算机算法分析与设计 ...

  7. 八皇后BFS算法、DFS算法、A*算法代码理解

    代码参考了Python:DFS/BFS/UCS解决八皇后问题_流动的风与雪的博客-CSDN博客 和Python:GBF/A*算法解决八皇后问题_流动的风与雪的博客-CSDN博客 但是我花了两天时间才看 ...

  8. 回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai 更多精彩干货敬请关注! 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 第一次遇到它的时候应该 ...

  9. 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...

最新文章

  1. expect安装使用
  2. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积起点定理 | 左边序列概念 | 推理 )
  3. python 关于排序的问题
  4. ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示
  5. C语言中的自定义类型
  6. 音视频开发( 34)---麦克风阵列原理二
  7. 【java】java ReentrantLock 源码详解
  8. nutch2.1抓取中文网站
  9. 【值得学习】售前工程师的成长(四)---一个老员工的经验之谈
  10. Kubernetes支持有状态服务的部署
  11. Codeforces Round #518 (Div. 2): F. Knights(神题)
  12. Linux 目录简要结构认识
  13. 浙大 PAT 甲级 1017 Queueing at Bank C++
  14. 51单片机——LED流水灯
  15. 《北京市工作居住证》办理攻略
  16. NCURSES程序设计之魔数方阵
  17. 操作系统之Auditing Subsystem—Linux OS
  18. 传国宝玺 第二部 降墓 第十六章 三煞天棺
  19. 微信公众平台开发解惑
  20. Centos系统修改为静态ip

热门文章

  1. python和C++代码实现图片九宫格切图程序(附VS2015配置Opencv教程)
  2. RecylerView的介绍与简单应用
  3. java类加载器以及spi
  4. 关于(nID 0xFFF0) == IDM_ABOUTBOX的思考
  5. AD导入CAD图纸笔记
  6. win10版本查看_2004版本的Win10软件经常无故没反应,原因竟是输入法兼容性
  7. 西华师大计算机学术硕士点升一级,西华师范大学电子信息工程学院研究生单项奖学金、特别奖学金评审细则...
  8. 日语五十音图快速记忆
  9. uniapp关闭默认返回安卓和ios
  10. 宇视服务器常用linux命令