bfs
定义
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
模板
struct node{
int x,y,step;//x,y都表示坐标 step表示步数
}t1,t2;
void bfs(int x,int y){
queue <node> q;//一般为结构体
t1.x=x,t1.y=y,t1.step=0;
q.push(t1);//将t1输入
while(!q.empty()){
//一般为 在队列为空时退出
t1=q.front(),q.pop();//访问第一个队列
for(int i=0;i<4;i++){
int nx=t1.x+d[i][0];
int ny=t1.y+d[i][1];
int nstep=t1.step+1;//求新的位置
if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&!vis[nx][ny]){
vis[nx][ny]=1;
t2.x=nx,t2.y=ny,t2.step=nstep;
if(a[t2.x][t2.y]=='*'){
//提前退出,可以不写
return;
}
q.push(t2);//将t2输入
}
}
}
}
例题
1.仙岛求药
题目描述
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M*N 个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。 下图 显示了一个迷阵的样例及李逍遥找到仙药的路线。
输入格式
输入有多组测试数据。每组测试数据以两个非零整数M和N开始,两者均不大于 。M表示迷阵行数,N表示迷阵列数。接下来有M行,每行包含N个字符,不同字符分别代表不同含义:
- "@" :少年李逍遥所在的位置;
- "." :可以安全通行的方格;
- "#":有怪物的方格;
- "*":仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。
输出格式
对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数不包括初始位置的方块)。如果他不可能找到仙药, 则输出-1 。
样例输入
8 8
.@##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.…
.#…###
6 5
..#.
.#…
…##.
…
.#…
…@
9 6
.#…#.
.#.*.#
.####.
…#…
…#…
…#…
…#…
#.@.##
.#…#.
0 0
样例输出
10
8
-1
很经典,bfs必须学习。只要在模板上加上提前退出。
void bfs(int x,int y){
queue <node> q;
t1.x=x,t1.y=y,t1.step=0;
q.push(t1);
while(!q.empty()){
t1=q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=t1.x+d[i][0];
int ny=t1.y+d[i][1];
int nstep=t1.step+1;
if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&!vis[nx][ny]){
!!!!
vis[nx][ny]=1;
t2.x=nx,t2.y=ny,t2.step=nstep;
if(a[t2.x][t2.y]=='*'){
printf("%d\n",t2.step);
f=1;
return;
}
q.push(t2);
}
}
}
}
2.营救
题目描述
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快 赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成 个比较小的单位,其中用 标明的是陆地,用 标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
输入格式
第一行为 n,下面是一个的 n*n 矩阵,表示海洋地图。
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
输出格式
哥伦比亚号到铁塔尼号的最短距离。
样例输入
3
001
101
100
1 1 3 3
样例输出
4
在上基础上简单修改即可
3.乳草的入侵
这道题十分有简单 ,就是输入很恶心
注意:
1.输入的第一个数是行,第二个数是列。这样一来,输入 M x MxMx 和 M y MyMy 的顺序也要改变。 (我就是在这里被卡爆了)
2.题目的输入中,行不是 1 ~ y ,是反向输入的,即 y ~ 1。
思路:
用 BFS 搜索,当队列清空后,说明已经搜索完了整个地图,就可以通计答案了。
#include <bits/stdc++.h>
using namespace std;
struct node {
int x, y, step;
} t1, t2;
bool vis[105][105];
int dx[8]= {
1,-1,0,0,1,-1,1