您的位置:首页 > 其它

图的搜索(bfs)

2016-03-30 14:15 309 查看
一般解决最短路程,最少步数的时候用bfs,bfs用到队列(先进先出),进行一层一层的搜索,其实bfs之所以能更好的解决最短路问题我觉得就是因为他是一层一层的去搜索。比如,他是先把第一步能走到的格子都入队,然后又以第一步走到的那个格子为基础,第二步能走到的格子在入队,直到找到终点。

下面以一个题目为例,讲一下二维图像上的bfs。

题目描述:














代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;

struct node
{
int x,y;//x,y表示坐标
int t;//t表示当前步数
};

queue<node> q;
node s,f;
char a[110][110];
char vis[110][110];
int xx[4]={1,0,0,-1};
int yy[4]={0,-1,1,0};
int n;

int bfs()
{
int i,j;
q.push(s);//起点入队
vis[s.x][s.y]=1;//起点标为已经搜索过
while(!q.empty())
{
node now=q.front();

for(i=0;i<4;++i)//搜索每个能达到的当前点的周围四个点
{
node New;
New.x=now.x+xx[i];
New.y=now.y+yy[i];
New.t=now.t+1;//都是当前点通过一步走过去的

if(New.x<0||New.x>=n||New.y<0||New.y>=n||a[New.x][New.y]=='#'||vis[New.x][New.y]==1) continue;//如果越界或者这个点已经走过或者是障碍则跳过

q.push(New);//新走到的格子入队
vis[New.x][New.y]=1;//标记为已走过

if(New.x==f.x&&New.y==f.y) return New.t;//如果到达终点
}
return -1;

}

}
int main()
{

int t;
scanf("%d\n",&t);
while(t>0)
{
int ans;
int i,j;

scanf("%d",&n);
getchar();//吃回车

for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='@')
{
s.x=i;s.y=j;
}
else if(a[i][j]=='*')
{
f.x=i;f.y=j;
}
}
getchar();//吃回车

}

memset(vis,0,sizeof(vis));//标记搜没搜过的数组每次都要重置
s.t=0;//起点步数为零

ans=bfs();
if(ans>0) printf("%d",ans);
else printf("MISSION FAILED");

t--;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: