基础算法 之 BFS & DFS

本文探讨了在迷宫问题中如何利用BFS和DFS算法寻找路径。基础数据是一个20x20的图,从左上角开始,目标是找到标记为'*'的终点。介绍了节点类、访问标记、扫描方向、约束条件以及DFS的递归与栈、BFS的队列操作。根据目标深度和分布,BFS适合浅层广度探索,DFS适合深层优先探索。
摘要由CSDN通过智能技术生成

Algorithm

BFS & DFS

本篇文章讨论一个最基础寻路场景 迷宫 在DFS BFS 中怎样求解
基础数据:

0#000000#*#########
0###0#00#0000000000
000#0#00##########0
#0000#00#0000000000
######00#0000######
00000000#0000000000
0000#00##########00
0000#00000000000000
0000#00000000000000
0000#00000000000000
0000#00000000000000
0000#0#############
0000000000000000000
0000000000000000000
0000000000000000000
0000000000#########
0000000000##0000000
00000#######0000000
0000000000000000000
0000000000000000000

此图为一个 202 大小的图 以任意坐标如x=0,y=0则为从左上角开始出发 符号#则为不能穿过
开始 直到寻找到*为结束 最后将路径输出为符号 (.)

基础框架

节点类

class node
{
   
public:
    int x,y;
    int count;
    node():x(0),y(0),count(0){};
    node(int a,int b,int c){x=a;y=b;count=c;}

};

访问标记

如果图为二维数组的话 一般需要设置一个同样大小的访问标记图 以判断该点是否被走过了从而避免向回扫描 或者重复走
以一个布尔数组来定义

bool visited[mapsize][mapsize]

扫描方向

在一般的题目中可能出现的有两种形式即四方向 上下左右

int dir[4][2]={0,1,0,-1,1,0,-1,0}; //方向

和八方向 上下左右 以及偏方向 上左…下右

int dir[8][2]={0,1 ,0,-1 ,1,0, -1,0  
             -1,-1 ,-1,1 ,1,1, 1,-1};

或者

int dx[8]={
  0,0,1,1,1,-1,-1,-1};
int dy[8]={
  1,-1,1,0,-1,1,0,-1};

约束条件

此部分是为了防止访问超出边界或者图中的阻隔元素。

bool check(int x,int y)
{
    if(x<0||x>=mapsize||y<0||y>=mapsize||map[x][y]=='#'||vis[x][y]==true||map[x][y]==0)
    return true;
    else return false;
}

DFS 递归 与 栈

DFS

使用栈来保存未被检测的点 节点按照深度优先次序被访问并依次入栈 并以相反的次序出栈进行新的检测

void DFS2(node s)//非递归DFS
{
    cout<<"______________DFS___________"<<endl;
    stack <node> p;
    p.push(s);
    vis[s.x][s.y]=true;
    while(!p.empty())
    {
        node now = p.top();
        //现在的位置是刚刚被推进栈顶的位置 由于先进后出所以向更深处搜索
        p.pop();//出队一个元素
        if(map[now.x][now.y]=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值