bfs

bfs原理

bfs就是广度优先搜索,与深度优先搜索有类似之处也有不同之处。
深度优先搜索是不撞南墙不回头的莽夫。
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;
}
bfsbfs Woo--k 发布了5 篇原创文章 · 获赞 0 · 访问量 134 私信 关注
上一篇:Leetcode题解 - 中等难度(1311、LCP 3、1306、1282、1296、1297)


下一篇:假期学习dfs(深搜)