dfs和bfs的简单总结
首先是dfs,又名深度优先搜索。看名字就知道,它的核心思想就是一直搜索,先在一条路上面一路撸到底,如果到底没有办法前进了,那么判断是否到达终点,如果没有到达,那么就回溯到之前的点再撸。
dfs的要点:
1、考虑当下应该怎么做,在你现在的点上面你应该怎么做,可以怎么做。可以向上吗?可以向下吗?
2、后面的和前面一样的做。递归的思想。
3、要考虑边界,终点等题目给出的条件检测。过滤掉那些不需要的解。
4、利用适当的数据结构,保存当前点是否走过,保存走过的路线等。
模版:
void dfs(int step)
{
判断你的所有条件,如果不行直接return;
for(循环每一个方向)
{
dfs(step+1)
}
return;
}
map【】【】记录走过的地方,走过的记为1
可以尝试利用堆栈来存放记录
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream> using namespace std; int result[];
int book[];
int r=;
/*求九个不同的个位数组合满足,3位+3位=3位的题目,主要是记录一下dfs的模版*/
void dfs(int step)
{
if(step == )/*简单的优化一下*/
{
int sum = result[]* + result[]* + result[]* + result[]* + result[] + result[]; if(book[sum%] == )
return; sum/=; if(book[sum%] == )
return; sum/=;
if(book[sum%] == )
return;
} if(step == )
{
if(result[]* + result[]* + result[]* + result[]* + result[] + result[] == result[]* + result[]* + result[])
{
printf("%d%d%d + %d%d%d = %d%d%d\n",result[],result[],result[],result[],result[],result[],result[],result[],result[]);
r++;
}
return;
} int i;
for (i = ; i <= ; i++)
{
if(book[i] == )
{
result[step] = i;
book[i] = ;
dfs(step+);
book[i] = ;
}
} return;
} int main()
{
clock_t start,finish;
double duration;
start = clock(); dfs();
cout<<"-------------------"<<r<<endl; finish = clock();
duration = double(finish - start)/CLOCKS_PER_SEC;
printf("time used:%f ms\n\n",*duration);
return ;
}
接下来是bfs,又名广度优先搜索,他是一个老实人,一步步走的很踏实,只有把n步的能走的地方走遍,才会走第n+1步,慢慢的拓展
要点:
1、用队列保存每一步走的结果,用一个字段去表示走的步数;
2、没有递归,利用while循环到最终结果;
3、时刻注意队列的首尾指针的位置;
模版:
while(head<tail)
{
for(循环所有方向)
{
把坐标进行改变,改成now的坐标,意思就是走一步
判断所有不可能的情况,不可能就continue
标记走过了
在队列中加入这个走过的点和步数
*****tail++*****
}
*****head++*****
}
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream> using namespace std; /*首先定义方向数组*/ /*
X/Y 0/-1
-1/0 0/0 1/0
0/1
右下左上*/ int way[][] = {
{,},//右
{,},//下
{-,},//左
{,-}//上
};
int map[][];
int book[][];
int n,m;
int head=;
int tail=;
int flag=; struct que
{
int x;
int y;
int stpe;
}; struct que q[]; int main()
{ int x,y;
cin>>n>>m;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= m; j++)
{
cin>>map[i][j];
}
} head = ;
tail = ; q[tail].x = ;
q[tail].y = ;
q[tail].stpe = ;
tail++; book[][] = ;
flag = ; while (head<tail)
{
for (int i = ; i < ; i++)
{
x = q[head].x + way[i][];
y = q[head].y + way[i][]; if(x< || y < || x > n || y > m)
continue;
if(map[x][y] == && book[x][y] == )
{
q[tail].x = x;
q[tail].y = y;
q[tail].stpe = q[head].stpe + ;
tail++;
book[x][y] = ; } if(x == && y == )
{
printf("--------------------%d\n",q[tail-].stpe);
return ;
}
}
head++;
} return ;
}
主要是记录一下两钟搜索的模版,具体两种搜索的使用还要在实际中进行检验,对于迷宫的题目只是现在肯定不会迷茫了,之后对于图的遍历还有别的,对于两种搜索的比较取舍,之后再写吧。
dfs和bfs的简单总结的更多相关文章
- DFS与BFS——理解简单搜索(中文伪代码+例题)
新的方法和概念,常常比解决问题本身更重要. ————华罗庚 引子 深度优先搜索(Deep First Search) 广度优先搜索(Breath First Search) 当菜鸟们(比如我)初步接触 ...
- DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
DFS and BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- dfs和bfs的区别
详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...
- lightoj 1111 - Best Picnic Ever(dfs or bfs)
题目链接 http://www.lightoj.com/volume_showproblem.php?problem=1111 题意:给你一个有向图再给你几个人的位置,问所有人可以在哪些点相聚. 简单 ...
- [转帖]dfs和bfs
dfs和bfs https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜 ...
- 图的DFS与BFS遍历
一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...
- 二叉树 - DFS与BFS
二叉树 - DFS与BFS 深度优先遍历 (DFS Depth First Search) 就是一个节点不到头(叶子节点为空) 不回头 广度有点遍历(BFS Breadth First Sea ...
随机推荐
- Bmob Androidstudio配置
AndroidStudio配置 鉴于目前Google官方推荐使用 Android Studio 进行Android项目开发,自 V3.4.2 开始,Bmob Android SDK 可以使用Gradl ...
- Hadoop作业优化
mapper数量 reduce数量 combiner 中间值压缩 自定义序列 调整shuffle,减少溢出写 关闭推测执行 任务JVM重用 慢启动reduce
- 使用纯css3实现图片轮播
<!DOCTYPE html> <html> <head> <title> 飛天网事--纯CSS代码实现图片轮播 </title> < ...
- LibRTMP优化之调整输出块大小
1. 为什么要调整输出块大小 首先在RTMP_Connect0函数中LibRTMP是关闭了Nagle算法这个TCP选项的,为了实时性这样做是好的,但是要注意到LibRTMP的结构体RTMP的成员是有m ...
- CVE-2014-4113 Win8.1 64位利用(2014.11)
CVE-2014-4113 Win8.1 64位利用 关于漏洞成因的分析已经很多了,但是样本针对的是win8之前的利用,国外研究员Moritz Jodeit对Win8.1上的利用做了研究,并给出了思路 ...
- drupal7 上传文件中文乱码
drupal7自带有file模块,可以上传文件. 但是存在问题:如果上传的文件名称是中文,存储在文件下面的文件名称是乱码的,解决办法如下:参考出处 includes/file.inc中,修改两处代码, ...
- WPF类层次结构
WPF类层次结构 System.Threading.DispatcherObject类 WPF应用程序使用STA(Single Thread Affinity)模型,整个用户界面由一个单独的线程拥有, ...
- PHP实现中文截取无乱码
字符串的处理是编程中比较常见的,各种编程语言对字符串的处理也提供了大量函数,像php中mb_substr()函数可以实现对中文字符串的截取,如何使用自定义方法实现中文字符串截取无乱码这也是面试经常遇到 ...
- C#获取键盘和鼠标操作的时间的类
/// /// 创建结构体用于返回捕获时间 /// [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { /// /// 设置结构体 ...
- 理解 php 中& 引用
php中引用&的真正理解-变量引用.函数引用.对象引用 php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没 ...