一月二十二日总结(bfs广度优先算法学习)

 作为一个刚入坑不久的新手,今天才刚刚开始接触较难算法的学习。首先,我便选择了bfs算法作为算法学习的开始。

由于正处于寒假之中,大部分学习都是属于自学。所以,我便在B站上进行相关算法的学习。从最经典的迷宫问题开始进行bfs学习。

迷宫问题代码如下:

#include<bits/stdc++.h>
using namespace std;
struct point{//定义结构体
   int x;
   int y;
   int step;
};
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};//定义的dx与dy来表示在搜索点在坐标上的下一步运动
queue<point> r;//引入队列
int main()
{
    int s[100][100],v[100][100];
    int n,m;
    scanf("%d %d",&n,&m);
    int flag=1;//定义一个flag,来判断有解与无解两种情况
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&s[i][j]);
        }
    }
    int starx,stary,p,q;             
    scanf("%d %d %d %d",&starx,&stary,&p,&q);
    struct point str;
    str.x=starx;
    str.y=stary;
    str.step=0;          
    r.push(str);//将起始点与步数入队
    v[starx][stary]=1;//将起点设置成已访问状态,防止重复
    while(!r.empty()){
        int x=r.front().x,y=r.front().y;
        if(x==p&&y==q){
            flag=0;
            printf("%d",r.front().step);
            break;
        }
        for(int k=0;k<=3;k++){
            int tx,ty;
            tx=x+dx[k];
            ty=y+dy[k];//用tx、ty代表点运动的方向
            if(s[tx][ty]==1&&v[tx][ty]==0){
                struct point temp;
                temp.x=tx;
                temp.y=ty;
                temp.step=r.front().step+1;
                v[tx][ty]=1;//设置已访问状态
                r.push(temp);//将广搜后的下一点入队
            }
        }
        r.pop();//将首队列输出
    }
    if(flag==1){
        printf("No answer");
    }
    return 0;
}

这个代码比较好懂。在听up主的讲解之后,原先不懂的也慢慢的开始理解。

对于此代码的理解,先要对基本的东西有所了解

1.结构体的定义。该代码中一个主要的思想就是将坐标用定义结构体的方式去表示,减少了许多麻烦,使代码更简洁。
2.队列的出和入。除了结构体外,此代码还有一个关键的点,就是队列的出和入。其中,通过“!r.empty()"判断while循环是否结束,运用的出入队列的概念。
3.二维数组的定义。在代码中,定义了两个二维数组,一个输入,一个访问。

除了上述这些之外,该代码也较高效,简洁

 for(int k=0;k<=3;k++){
            int tx,ty;
            tx=x+dx[k];
            ty=y+dy[k];//用tx、ty代表点运动的方向
            if(s[tx][ty]==1&&v[tx][ty]==0){
                struct point temp;
                temp.x=tx;
                temp.y=ty;
                temp.step=r.front().step+1;
                v[tx][ty]=1;//设置已访问状态
                r.push(temp);//将广搜后的下一点入队
            }
        }

这段代码可以替换成:

        //右
        if(s[x+1][y]==1&&v[x+1][y]==0){
            struct point temp;
            temp.x=x+1;
            temp.y=y;
            temp.step=r.front().step+1;
            r.push(temp);
        }
        //下
        if(s[x][y-1]==1&&v[x][y-1]==0){
            struct point temp;
            temp.x=x;
            temp.y=y-1;
            temp.step=r.front().step+1;
            r.push(temp);
        }
        //左
        if(s[x-1][y]==1&&v[x-1][y]==0){
            struct point temp;
            temp.x=x-1;
            temp.y=y;
            temp.step=r.front().step+1;
            r.push(temp);
        }
        //上
        if(s[x][y+1]==1&&v[x][y+1]==0){
            struct point temp;
            temp.x=x;
            temp.y=y+1;
            temp.step=r.front().step+1;
            r.push(temp);
        }

但是for循环以及数组的运用,让代码变得更加的高效。

这就是今天对于bfs的学习与了解,对于迷宫问题,bfs提供了一种解题的方法。如果有别的需求,可以在此代码基础上进行变通。有时,可能会运用到dfs的思路。

所以,对于bfs和dfs的学习必不可少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值