DFS(深度优先搜索):
1.概念;
官方:事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
个人理解:以深度为先,以一定的方向一条路走到尽头为止后原路返回
再继续以定的方向一条路走到尽头为止后原路返回…………
的方式去遍历每一条路。
2.图解:
什么叫以一定的方向呢?可以规定遍历方向为:右,下,左,上。
例如6号位置,有四条路可以走,因为我们人为规定了方向,所以它得先从右开始走起。
观察起点,不难发现起点就只有一条向下的路可以走,到达1号点后,
有两条路可走,由于规定了方向,所以向往右到达2号点,
以此类推到达4号点后,向右走不通,所以向下走到8号点,8号点的右也不通,所以走到12号点。
接着继续走到16,15,14,13,9,10,11。每到达一个点后都需要标记此点是已经走过的。
这样就遍历完了一条路。
接着开始原路返回
从11->10,因为刚刚10是从右到11,10的下不通,左边9号由于被标记了,所以只能往上走到6号,注意从10->6之后需要把10号标记取消!
之后6->7,由于7的右边8已被标记,所以向下到达11.
这样就遍历完第二条路了。
这时候原来返回到7…………
看到这里,对于DFS应该有了一定的认知了吧,现在开始实操代码吧
3.代码实现:以上面的图为例子。
#include <stdio.h>
int startx, starty,endx,endy;
int min=9999;
int book[5][5] = { 0 };
void dfs(int x, int y,int step)
{
int sx[4] = { 1,0 -1,0 };//改变方向的数组
int sy[4] = { 0,1,0,-1 };
if (x == endx && y == endy)//判断是否走到了终点
{
if (min > step)
{
min = step;
}
return;//原路返回,这里return很重要
}
for (int i = 0; i <= 3; i++)//用循环来完成方向的向右,向下,向左,向上。
{
x = x + sx[i];
y = y + sy[i];
if (x >= 0 && x <= 3 && y >= 0 && y <= 4)//判断是否越界
{
if (book[x][y] == 0)//判断是否是已标记的点
{
book[x][y] = 1;//标记已走过的点
dfs(x, y,step+1);
book[x][y] = 0;//解放已标记的点
}
}}
return;//到了死胡同的原路返回,这里return很重要}
int main()
{
scanf("%d %d", &startx, &starty);//初始坐标
scanf("%d %d", &endx, &endy);//终点坐标book[startx][starty] = 1;//标记初始坐标
dfs(startx, starty,0);//dfs
printf("%d", min);
return 0;
}