昨天说了dfs,今天当然要聊聊我们的bfs啦,在一定情况下我们的bfs是要比dfs优越点的,特别是在寻找最短路径的时候,我bfs输出的就是最短的。dfs还要比较。。。
- 当然还是要介绍一下什么是bfs
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。——摘自百度百科。
当然我们不可能聊到树,因为我还没学QAQ。 并且,会在以后讲图的遍历中的bfs。 我认为的bfs就是队列加迭代
- 队列简介
在介绍bfs之前,当然要先说说他的好基友,队列啊! 队列,队列,顾名思义排了队的序列。 我们接着用一道题来说一说队列。 题目:肖恩问佩琪要QQ,但是佩琪没有直接给肖恩,而是给了肖恩一串加密后的数字。 具体规则是这样的,第一个删除,第二个数放到末尾 第三个数删除,第四个数放到末尾。 依次类推。删除的序列就是佩琪的QQ。
我们该怎么处理呢? 这就需要我们的队列了。 第一个也就是我们的head,记录队首。 末尾就是我们的tail,记录队尾。 第一个数删除,也就是模拟我们的出队。 第二个数放到最后,也就是模拟我们的入队。 此时我们的head 也就是第一个数,要向后移动head++,才能操作我们的第二个数,第二个数放到末尾,我们要tail++,才能操作我们第四个数就这样一次类推。
请看具体代码
队列
#include "stdio.h"
struct queue
{
int a[100];
int head;
int tail;
};
int main()
{
struct queue q;
int i;
q.head=1;
q.tail=1;
for(i=1;i<=9;i++)
{
scanf("%d",&q.a[q.tail]);
q.tail++;
}
while(q.head<q.tail)
{
printf("%d",q.a[q.head]);
q.head++;
q.a[q.tail]=q.a[q.head];
q.tail++;
q.head++;
}
return 0;
}
相信大家对队列已经有所了解了
- 接着我们将用一道题来说一说bfs
这道题的题目是肖恩找佩琪。 肖恩的位置在(1,1)。 佩琪的位置在(4,3)。 我们希望用过最短路径找到佩琪。 当然中间也会有一些障碍物。 我们规定0可走,1不可走。 地图如下 0010 0000 0010 0100 0001
#include "stdio.h"
struct note
{
int x;
int y;
int s;
};
int main()
{
int a[50][50]={0},book[50][50]={0};
int i,j,k,p,q,m,n,x,y,tx,ty;
struct note que[2501];
int next[4][2]={{0,1},
{1,0},
{0,-1},
{-1,0}};
int head,tail;
int flag;
printf("input two number");
scanf("%d%d",&n,&m);
printf("input the map");
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
printf("input the people address");
scanf("%d %d %d %d",&x,&y,&p,&q);
head=tail=1;
que[tail].x=x;
que[tail].y=y;
que[tail].s=0;
tail++;
book[x][y]=1;
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)
{
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;
带入各个数值最后输出的值是7 如果我们用dfs加判断最短的条件输出的也是7。
由于篇幅有限就不给大家敲dfs的代码了。
希望大家能通过这一道例题明白bfs的基本含义
bfs就是一步一步尝试,不断试错,找到最佳!
------以上题目和代码出自《啊哈!算法》 我仅对部分代码坐了充分的补充和注释。
|