首先是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的简单总结的更多相关文章

  1. DFS与BFS——理解简单搜索(中文伪代码+例题)

    新的方法和概念,常常比解决问题本身更重要. ————华罗庚 引子 深度优先搜索(Deep First Search) 广度优先搜索(Breath First Search) 当菜鸟们(比如我)初步接触 ...

  2. DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告

    DFS and  BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...

  3. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  4. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  5. dfs和bfs的区别

    详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...

  6. lightoj 1111 - Best Picnic Ever(dfs or bfs)

    题目链接 http://www.lightoj.com/volume_showproblem.php?problem=1111 题意:给你一个有向图再给你几个人的位置,问所有人可以在哪些点相聚. 简单 ...

  7. [转帖]dfs和bfs

    dfs和bfs https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜 ...

  8. 图的DFS与BFS遍历

    一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...

  9. 二叉树 - DFS与BFS

    二叉树 - DFS与BFS ​ 深度优先遍历 (DFS Depth First Search) 就是一个节点不到头(叶子节点为空) 不回头 ​ 广度有点遍历(BFS Breadth First Sea ...

随机推荐

  1. 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如:  List list = new ArrayList();  list.add(“Hello”);  list.add(“World”);  list.add(“Learn”); //此时list 为Hello World Learn  r

    package zuoye; import java.util.ArrayList; import java.util.List; public class Reverse01 { public st ...

  2. ASP.NET中的Excel操作(NPOI方式)

    代码准备: 一:实体准备 代码如下: /// <summary> /// 一个能添加到将要导出到指定行的实体类型规范 /// data:{int StartColIndex ? 0, in ...

  3. MemoryStream 转 pdf

    在项目开发中用到将MemoryStream 转pdf,在转化过程中需要建了一个.dom格式的模板,先保存为.doc文件,然后再转换为.pdf. 有一个插件感觉好不错,给大家推荐一下. dll下载链接  ...

  4. Nginx “邪恶” rewrite

    概述 本文主要针对nginx rewrite指令困惑的地方进行讲解,中间会涉及部分原理部分,我尽量用通俗易懂的语言来形容 功能讲解 大致流程 The ngx_http_rewrite_module m ...

  5. 把ResultSet对象转变成List对象

    private static List<Map<String, Object>> convertRS2List(ResultSet rs) throws SQLExceptio ...

  6. Struts2--课程笔记2

    动态方法调用(在请求的时候,再明确具体的响应方法,配置的时候不明确): LoginAction类中有两个方法some和second 1. 动态方法的调用(修改常量struts.enable.Dynam ...

  7. Redis简介三

    目录 一.Key 二.String 三.Hash 四.List 五.Set 六.SortedSet 七.Pub/Sub 八.Transaction 九.Script 十.Connection 十一.S ...

  8. Oracle 10gR2 Dataguard搭建(非duplicate方式)

    Oracle 10gR2 Dataguard搭建(非duplicate方式) 我的实验环境: 源生产库(主库): IP地址:192.168.1.30 Oracle 10.2.0.5 单实例 新DG库( ...

  9. SPOJ 705 New Distinct Substrings

    后缀数组.按照排序完的后缀一个一个统计.每一个后缀对答案做出的贡献为:n-SA[i]-height[i]. #pragma comment(linker, "/STACK:102400000 ...

  10. 把excel数据导入mysql中

    适用:每列的数据都不是以逗号分隔. 1.在mysql建表,全部字段与表头相同且顺序一致 2.将excel另存为csv格式,用Editplus把CSV文件另存为UTF-8编码格式 3.执行load da ...