bfs(广度优先搜索)
与dfs一条路走到底再返回不同的是bfs是层层递进的,bfs先考虑了当前能走的所有方向(或者说先考虑了当前能做的所有操作)
bfs的层层递进式能够再找最短路径之类的问题时,带来不少方便。
因为层层递进所以如果当前想要进行的操作已经被进行过了的话,去掉这种操作的可能性,因为现在进行该操作得到的最后答案必然不是最小
这里采用了结构体来存储,因为这个比较方便;(下面是一个例题可以来感受一下用法,还是挺好理解的)
代码:小蝌蚪找妈妈👇
给出一个n*m的地图,如果是1则不能走,如果是0,则可以走,
在地图后会先后给出小蝌蚪的起点和妈妈的位置(题目确保二者都在0上);
#include <iostream>
using namespace std;
struct xxx{
int h,l,s;
};
int main(){
xxx b[2500];//这里是考虑了50*50的地图
int i,j,th,tl,kh,kl,eh,el,f,n,m,a[50][50],t,w,c[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//c数组用来进行上下左右的方向移动
while (cin>>n>>m){
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
cin>>kh>>kl>>eh>>el;//读入起点和终点
kh--;//个人喜欢从0开始
kl--;
eh--;
el--;
t=w=f=0;
b[w].h=kh;
b[w].l=kl;
b[w].s=0;
w++;
while (t<w){
for(i=0;i<4;i++){
th=b[t].h+c[i][0];
tl=b[t].l+c[i][1];
if(th<0||th>=n||tl<0||tl>=n) continue;//判断是否越界
if(a[th][tl]==0){//判断是否能走
a[th][tl]=1;//如果能就将这个点变成不能走
b[w].h=th;//同时读入这个点
b[w].l=tl;
b[w].s=b[t].s+1;
w++;
}
if(th==eh&&tl==el){
f=1;
break;
}
}
if(f)break;
t++;//这里t递增,可以保证不会重复判定
}
if(f)cout<<b[w-1].s<<endl;
else cout<<"impossible"<<endl;
}
return 0;
}
这里因为本人这时候初学的bfs所以用的是数组
用队列或者链表也可以实现