深度优先搜索(Depth First Search)
深度优先搜索,一种非常快速的 搜索方式,接下来我们将主要讨论:
- 搜索方式
- 本质
- 应用
搜索方式
深度优先搜索原本是专门为树形图与无向图准备的,如下图
我们要在地图中找到宝藏,从a点向下遍历,真希望b,c都走啊!但是我们不能分身,所以只能先走b好了,在这时我们的程序里的函数要自调用一次,意思就是,把b看作a,f看作b,g看作c,继续操作,接下来走到f。f无路可走了!那就只好return;回到b,这时b可以走到g,g也无路可走了!之后回到b。这就是:回溯。f,g都走过了,也只好回到a。右面也是一样。
问题来了,走到b怎么保证不回到a呢?我们可以在程序开始时将树形图所有位置设成0,走到哪,就标1,然后在程序里判断只有0可以走,就可以避免重复走啦!
无向图原理一致
本质
这其实就是把所有可能性遍历一遍!找到最优路径,替换次要路径,打擂台找最优!!
应用
者可以用在迷宫中,所有障碍物标1,所有空地标0,就能走出迷宫。但是很慢,在比赛中,大地图中我们没时间都遍历一遍,那就使用bfs,广度优先搜索,下个博客我会讲哦!
献题
本人献上一道题:解救小扣
题目描述
有一天,小扣一个人出去。但是小扣在外遇到坏人,只能先躲起来报警。警察得知后便立即去解救无助的小扣。警察当然是有备而来,已经弄清楚了附近的坏人,现在警察要以最快的速度去解救小扣。问题就此开始了……
地图由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是坏人。你的任务是帮助小艾找到一条从迷宫的起点通往小扣所在位置的最短路径。注意,遇到坏人会阻止你解救小扣,当然警察也不能走到迷宫之外。
输入描述
第一行输入地图横纵方向各有多少位置能走。 按照数组的方式,输入地形图。 先输入警察的坐标,在输入小扣的坐标。
输出描述
最短需要多少时间才能解救小扣。
输入样例
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
输出样例
7
思路:
这就是我们的01障碍物问题,每走一步,就得递归一次,怎么走呢?
在编程坐标系中表示出来就是:
int nextstep[4][2] = {
{
0, 1}, {
1, 0}