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