C++ BFS

BFS即:层序遍历,一层层的搜,具有最短性;

我们从下图这棵树进行解释:

在这里插入图片描述

我们用BFS来实现这棵树的层序遍历:
借助队列(由于它是先进先出的)来存取数据,我们将第一层的全部元素插入到队列,
然后取出队头元素,再将与队头元素有关的所有元素插到队尾,我们重复这个操作(即:取头,插尾), 直到队列为空时,我们便实现了层序遍历。

例题:https://www.acwing.com/problem/content/1103/

例题解析:
我们可以把起点看做第一层,起点可以向相邻的几个方向走,起点第一次可以走到的几个位置看做第二层元素,以此类推其他几层元素。

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>

#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;

const int N=210;
int n,m,t;
int dist[N][N];
char g[N][N];

int BFS(PII st,PII ed)
{
    memset(dist,-1,sizeof dist);
    dist[st.x][st.y]=0;
    
    queue<PII> q;
    
    q.push(st);
    
    int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};
    
    while(!q.empty())
    {
        PII t=q.front(); 
        
        q.pop();
        
        for(int i=0;i<4;i++)
        {
            int x=t.x+dx[i], y=t.y+dy[i];
            
            if(x<0 || x>=n || y<0 || y>=m) continue;
            if(g[x][y]=='#') continue;
            if(dist[x][y]!=-1) continue;
            
            dist[x][y]=dist[t.x][t.y]+1;
            
            PII k={x,y};
            
            if(ed==k) return dist[x][y];
            
            q.push({x,y});
        }
        
        
    }
    
    return -1;
}

int main()
{
    scanf("%d",&t);
    
    while(t--)
    {
        scanf("%d%d",&n,&m);
        
        for(int i=0;i<n;i++)
            scanf("%s",g[i]);
        
        PII st,ed;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++) 
                if(g[i][j]=='S') st={i,j};
                else if(g[i][j]=='E') ed={i,j};
        
        int d=BFS(st,ed);
        
        if(d!=-1) cout<<d<<'\n';
        else cout<<"oop!"<<'\n';
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值