首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题。

深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断重复,直到找到最终的解。从实现上来说,栈结构是后进先出,可以很好的保存上一步状态并利用。所以根据深搜和栈结构的特点,深度优先搜索利用递归函数(栈)来实现,只不过这个栈是系统帮忙做的,不太明显罢了。

广搜和深搜的搜索顺序不同,它是先搜索离初始状态比较近的状态,搜索顺序是这样的:初始状态---------->一步能到的状态--------->两步能到的状态......从实现上说,它是通过队列实现的,并且是我们自己做队列。一般解决最短路问题,因为第一个搜到的一定是最短路。

下面通过两道简单例题简单的入个门。

深搜例题

poj2386

http://poj.org/problem?id=2386

题目大意:上下左右斜着挨着都算一个池子,看图中有几个池子。

W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.例如本图就是有三个池子

采用深度优先搜索,从任意的w开始,不断把邻接的部分用'.'代替,1次DFS后与初始这个w连接的所有w就全都被替换成'.',因此直到图中不再存在W为止。

核心代码:

char field[maxn][maxn];//图
int n,m;长宽
void dfs(int x,int y)
{field[x][y]='.';//先做了标记//循环遍历八个方向for(int dx=-1;dx<=1;dx++){for(int dy=-1;dy<=1;dy++){int nx=x+dx,ny=y+dy;//判断(nx,ny)是否在园子里,以及是否有积水if(0<=nx&&nx<n&&0<=ny&&ny<m&&field[nx][ny]=='W'){dfs(nx,ny);}}}
}
void solve()
{int res=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(field[i][j]=='W'){//从有积水的地方开始搜dfs(i,j);res++;//搜几次就有几个池子}}}printf("%d\n",res);
}

广搜例题:

迷宫的最短路径

  给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四个的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。(N,M≤100)('#', '.' , 'S', 'G'分别表示墙壁、通道、起点和终点)

输入:

10 10

#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

输出:

22

小白书上部分代码:

typedef pair<int, int> P;
char maze[maxn][maxn];
int n, m, sx, sy, gx, gy,d[maxn][maxn];//到各个位置的最短距离的数组
int dx[4] = { 1,0,-1,0 }, dy[4]= { 0,1,0,-1 };//4个方向移动的向量
int bfs()//求从(sx,sy)到(gx,gy)的最短距离,若无法到达则是INF
{queue<P> que; for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)d[i][j] = INF;//所有的位置都初始化为INFque.push(P(sx, sy));//将起点加入队列中d[sx][sy] = 0;//并把起点的距离设置为0while (que.size())//不断循环直到队列的长度为0{P p = que.front();// 从队列的最前段取出元素que.pop();//删除该元素if (p.first == gx&&p.second == gy)//是终点结束break;for (int i = 0; i < 4; i++)//四个方向的循环{int nx = p.first + dx[i],ny = p.second + dy[i];//移动后的位置标记为(nx,ny)if (0 <= nx&&nx < n && 0 <= ny&&ny < m&&maze[nx][ny] != '#'&&d[nx][ny] == INF)//判断是否可以移动以及是否访问过(即d[nx][ny]!=INF){que.push(P(nx, ny));//可以移动,添加到队列d[nx][ny] = d[p.first][p.second] + 1;//到该位置的距离为到p的距离+1}}}return d[gx][gy];
}

经典了两个题结束了,好题链接持续更新。。。。。。

深搜DFS\广搜BFS 图初步入门相关推荐

  1. Go 分布式学习利器(15) -- Go 实现 深搜和广搜

    强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...

  2. 深搜和广搜的原理及优缺点

    深搜原理 深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇 ...

  3. 深搜和广搜(初学者)

    搜索入门 最近对搜索有了一点浅显的了解,想跟大家分享分享. 说起来我也是初学者,恰巧有些自己的理解,想起来自己开始学习搜索的情况,真是一把鼻子一把泪啊.所以想把我领悟的过程,看到的一些基础的我觉得好的 ...

  4. 搜索算法-深搜与广搜

    1.深搜与回溯法 *本文主要是供自己复习,或者做笔记总结使用,专业性有待考量,如果遇到不对的地方还请指出来. 什么是回溯法?枚举每一个填空的选项,然后判断这个选项是否合法.如果合法则继续填写下一个选项 ...

  5. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  6. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  7. [数据结构] 迷宫问题(栈和队列,深搜和广搜)

    代码: #include <iostream> #include <string.h> #include <stack> #include <queue> ...

  8. 深搜+回溯+广搜小结

    深搜 按照一定的顺序和规则,一直往深处走,直到走不通再返回,换一种路径重复上述步骤. 深搜一般可以找到问题的所有答案,但问题规模较大时,解集树的深度就会比较大并且比较宽,时间复杂度就会较高.与广搜相比 ...

  9. 深搜及广搜的实际应用

    这一周通过对搜索题目的大量练习,对于搜索也是有了一定的理解,首先对于深搜来说,有几种题型: 一.有一部分题目指示的很明确,也是基本的深搜类型,比如连通块类型,是显式的深搜 P1596 [USACO10 ...

最新文章

  1. 马云:“996 是一种巨大的福气”
  2. flutter学习(排雷)一
  3. jdk安装和环境变量的配置
  4. linux获取ad用户列表,Powershell小技巧之查询AD用户
  5. leetcode笔记:Search in Rotated Sorted Array
  6. cpld xilinx 定义全局时钟_时钟相关概念
  7. 1094 谷歌的招聘 (20分)_25行代码AC
  8. jenkins 通过批处理自动构建 非标准项目
  9. mui 时间样式错乱_微信编辑器样式排版错位怎么回事?
  10. 微分方程在matlab中的实现,Matlab微分方程参数优化的Forcal实现
  11. ad20导出bom没有Value属性
  12. 酷开网络首推“无界空间”,酷开系统8正式发布!
  13. salt自定义module - 两个文件的diff
  14. 2.13.PHP7.1 狐教程-【PHP 类】
  15. power builder的安装和使用
  16. 使用wxPython内嵌浏览器
  17. 票据纸张尺寸对照表_粉丝要求,这期整理一版平面设计必备各种尺寸知识(收藏版))...
  18. win32-防火墙-禁用软件联网-详细教程
  19. 程序报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘cv2.MultiTracker_create()‘
  20. php 圆周率指定位数,圆周率1500多位

热门文章

  1. UE4 HTC VIVE - 番外篇 - 局域网联机(一)
  2. eclipse中查看mysql_eclipse中怎样查看sqlite数据库的表
  3. redis 多线程_唬人的Redis多线程,也就那么回事
  4. 【转】04.Dicom 学习笔记-DICOM C-Move 消息服务
  5. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(五)
  6. 【转】Power Platform(简介)
  7. 【转】WebAPI ASP.Net 发布部署中常见的两个错误未能找到 CodeDom未能加载System.Web.WebPages.Razor
  8. 用于科研的移动机器人平台推荐
  9. .netcore持续集成测试篇之MVC层单元测试
  10. 一步步编写操作系统 57 门、调用门与RPL序 2