广搜与深搜入门

一.深度优先搜索DFS

1深度优先搜索的步骤分为

1.递归下去

2.回溯上来。

顾名思义,深度优先,则是以深度为准则,先一条路走到底,直到达到目标。这里称之为递归下去。 否则既没有达到目标又无路可走了,那么则退回到上一步的状态,走其他路。这便是回溯上来。 下面结合具体例子来理解。 如图所示,在一个迷宫中,黑色块代表玩家所在位置,红色块代表终点,问是否有一条到终点的路径

 以这个图为例,在1号可以向2.3走,3可以向4走,4再向5.8走,以此类推

#include <staio.h>
int goal_x=10,goal_y=10;//目标位置
int x_max=20,y_max=20;//这个是坐标边界
int map[x_max][y_max];//地图
int used[x_max][y_ma];//记录是否到达过这个位置,因为重复到达同一个位置都是一样的结果
int flag=0;
int x[4]={1,-1,0,0};
int y[4]={0,0,1,-1};//四周的四个方向

void dfs(int init_x,int init_y){
    //初始地址(也就是当前位置)
    if(goal_x==init_x&&init_y==goal_y){
        flag=1;//标记结束
        return;//判断是否成功
    }

    for(int i=0;i<4;i++){//这里是对四个方向遍历、
        int x1=init_x+x[i];
        int y1=init_y+y[i];//新的x,y
        if(x1>=0&&x1<x_maX&&y1>=0&&y1<max_y&&!flag){//这里目前只需要不越界,以后可能要考虑障碍等等
            used[x1][y1]=1;//标记为已到达
            dfs(x1,y1);//向下递归
            used[x1][y1]=0;//取消标记
        }
  
    }
}

二,广度优先搜索BFS

1.广度优先搜索较之深度优先搜索之不同在于:

深度优先搜索旨在不管有多少条岔路,先一条路走到底,不成功就返回上一个路口然后就选择下一条岔路

而广度优先搜索旨在面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路

并重复这样的操作,用图形来表示则是这样的,例子同上 从黑色起点出发,记录所有的岔路口,并标记为走一步可以到达的。然后选择其中一个方向走进去,我们走黑点方块上面的那个,然后将这个路口可走的方向记录下来并标记为2,意味走两步可以到达的地方。

 将第一步能达到的位置先去走,再去走第二步达到的。接下来上代码演示一下

 

我们在以后接触到这类搜索算法题的时候需要考虑障碍,最小步数等等限制,这些代码让大家了解一下大致的原理即可。

 最后大家可以练一下这几道题巩固一下,下一期讲解一下进阶一点的题

[USACO1.5]八皇后 Checker Challenge - 洛谷

马的遍历 - 洛谷

奇怪的电梯 - 洛谷

迷宫 - 洛谷

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TV后台码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值