bfs原理
bfs就是广度优先搜索,与深度优先搜索有类似之处也有不同之处。
深度优先搜索是不撞南墙不回头的莽夫。
广度优先搜索则像高塔一样稳健。
bfs要先建立一个队列
struct node
{
int ;//至少两个,一个表示数据,一个表示数据所在的位置。
};
dfs考虑的是当先该怎么做并用递归写出下一次,而bfs考虑的是下一次有几种做法。
我这里给出dfs的文章做对比dfs原理
我们用bfs来解dfs的原题。
例题
B先生在一个迷宫里迷路了,他需要A先生的救助,A先生也不知道怎么走,所以他只能一步一步试。
现在编程来帮A先生解救B先生。
输入
m,n代表迷宫的长与宽。
m行,n列0或1.其中0代表路,1代表障碍。
出发坐标(x,y)与目标坐标(sx,sy)
输出
最短步数。
输入样例
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
输出样例
7
bfs代码块
#include<stdio.h>
struct node
{
int x,y,s;//x,y为坐标,s为步数。
};
int main()
{
struct node que[2501];//地图
int a[51][51]={0},book[51][51]={0};
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//方向
int head,tail;
int i,j,k,m,n,sx,sy,p,q,tx,ty,flag;
scanf("%d%d",&n,&m);//初始化地图
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
scanf("%d",&a[i][j]);
scanf("%d%d%d%d",&sx,&sy,&p,&q);//队列初始化
head=1;
tail=1;
que[tail].x=sx;
que[tail].y=sy;
que[tail].s=0;
tail++;
book[sx][sy]=1;
flag=0;
while(head<tail){
for(k=0;k<=3;++k){
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1||tx>n||ty<1||ty>m)
continue;
if(a[tx][ty]==0&&book[tx][ty]==0){//和dfs一样乱七八糟的判断
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].s=que[head].s+1;
tail++;
}
if(tx==p&&ty==q){
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
printf("%d",que[tail-1].s);
return 0;
}
Woo--k
发布了5 篇原创文章 · 获赞 0 · 访问量 134
私信
关注