深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)

例题:1.组合的输出

【题目描述】

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。

现要求你用递归的方法输出所有组合。

例如n=5,r=3,所有组合为:

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

【输入】

一行两个自然数n、r(1<n<21,1≤r≤n)。

【输出】

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

代码:

#include <bits/stdc++.h>
using namespace std;int p[25];
int n,r,a,b=1,c;void dfs(int pre,int step){if(step>r){for (int i=1;i<=r;i++){printf("%3d",p[i]);}cout << endl;return;}for (int i=pre+1;i<=n;i++){p[step]=i;dfs(i,step+1);}
}int main(){cin >> n >> r;dfs(0,1);
}

2.迷宫

【题目描述】

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×nn×n的格点组成,每个格点只有22种状态,.#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

【输入】

第1行是测试数据的组数kk,后面跟着kk组输入。每组测试数据的第11行是一个正整数n(1≤n≤100)n(1≤n≤100),表示迷宫的规模是n×nn×n的。接下来是一个n×nn×n的矩阵,矩阵中的元素为.或者#。再接下来一行是44个整数ha,la,hb,lbha,la,hb,lb,描述A处在第haha行, 第lala列,B处在第hbhb行, 第lblb列。注意到ha,la,hb,lbha,la,hb,lb全部是从00开始计数的。

【输出】

kk行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。

代码:

#include <bits/stdc++.h>
using namespace std;const int N=110;int k,n,mk[N][N],ha,la,hb,lb,xy[4][2]={{1,0},{-1,0},{0,1},{0,-1}},flag;
char mp[N][N];void dfs(int x,int y){if (flag) return;for (int i=0;i<4;i++){int xx=x+xy[i][0];int yy=y+xy[i][1];if (xx>=0&&yy>=0&&xx<n&&yy<n&&mp[xx][yy]=='.'&&!mk[xx][yy]==1){if(xx==hb&&yy==lb){flag=1;return;}else{mk[xx][yy]=1;dfs(xx,yy);}}}
}int main(){cin >> k;while (k--){cin >> n;for (int i=0;i<n;i++){for (int r=0;r<n;r++){cin >> mp[i][r];}}cin >> ha >> la >> hb >> lb;flag=0;memset(mk,0,sizeof(mk));mk[ha][la]=1;if (mp[ha][la]=='#'||mp[hb][lb]=='#') cout << "NO" << endl;else {dfs(ha,la);if (flag==1){cout << "YES" << endl;}else{cout << "NO" << endl;}}}
}

深度优先搜索(c++)相关推荐

  1. [C] 深度优先搜索解决连通块/染色问题——求岛的个数

    本文介绍用DFS解决连通块个数问题 有关dfs的介绍见另外一篇:不撞南墙不回头--深度优先搜索 例题 宝岛探险 题目描述 一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示 ...

  2. 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索

    0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...

  3. leetcode dfs_深度优先搜索:具有6个Leetcode示例的DFS图遍历指南

    leetcode dfs Have you ever solved a real-life maze? The approach that most of us take while solving ...

  4. 【ACM】杭电OJ 1241(深度优先搜索小结)

    题目链接:杭电OJ 1241 深度优先搜索问题 深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解. ...

  5. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  6. c++输出方块_C/C++编程笔记:DFS 深度优先搜索的基本思想,含实例讲解

    采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点.不同的问题需要用不同的数据结构描述. 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新 ...

  7. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  8. 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...

    深度优先搜索 深度优先搜索是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) .在一个HTML文件中,当一个超链被选择后,被链接的HTML文件 ...

  9. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

  10. DFS(深度优先搜索)

    深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点. ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十四)-运动学-正向运动学和反向运动学(其一)
  2. cocos2d-x 2.X for Android中需要使用OpenGL ES 2.0
  3. Codeforces 963A Alternating Sum 【数论+数学】
  4. 中国科学院空天信息研究院苏州分院面试——总结
  5. Oracle 游标使用全解(摘抄)
  6. uniapp防抖操作
  7. 面试官系统精讲Java源码及大厂真题 - 03 Java 常用关键字理解
  8. 数据太多加滚动标题不动_音乐数据挖掘导引(四)
  9. 陈小玉:算法学习建议
  10. PDI(Kettle)加速插入数据的速度
  11. 订单中有订单详细实体类。保存订单
  12. Mac教程——创建txt文件、设置新建txt的快捷键方法
  13. 1万美元FS-ISAC网络安全奖学金
  14. [精简]托福核心词汇62
  15. 华三路由器虚拟服务器设置,H3C vLNS系列虚拟L2TP网络服务器 配置指导-E0324-5W100...
  16. HackTheBox::Blunder
  17. 2022年安全员-A证操作证考试题模拟考试平台操作
  18. 如何重装oracle数据库,oracle数据库的重装
  19. 一文看懂Modbus, Rtu, Rs485等名词的联系
  20. USB设备被识别流程

热门文章

  1. “游目骋怀—孙文佳书法展”近日在中国美术馆开幕
  2. 创客路上,跟着嘻多猴快乐出发!
  3. LeetCode第977题 有序数组的平方(c++)
  4. Java中计算处理中文两个字符长度问题解决(中文2个字符,英文1个字符)
  5. java循环购物车结算系统,购物车js代码_JS实现购物车商品列表结算功能代码
  6. 婚恋相亲交友网站搭建教程超级简单,一步就能拥有属于自己的网站
  7. 华硕主板固态硬盘不识别_如果ASUS主板BIOS主板无法识别NVMe m.2 SSD,该怎么办?...
  8. windows下pip下载库速度慢
  9. 【面经】美团算法二面
  10. Gradle-Eclipse插件安装