DFS(深度优先搜索)学习笔记(C语言版本)

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;
}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值