您的位置:首页 > 编程语言 > C语言/C++

C++广度优先搜索算法之走出迷宫

2017-06-09 21:15 169 查看

走出迷宫

Description
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

Input第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。Output输出从起点到出口最少需要走的步数。

Sample Input

3 3
S#T
.#.
...

Sample Output

6

这是典型的迷宫求最短路径问题,类似的题还有仙岛求药、拯救行动、献给阿尔吉侬的花束……

代码如下:

#include<cstdio>
int head=0,tail=1,nextx,nexty,n,m,beginx,beginy,endx,endy;
int pre[100000],a[100000],b[100000];
int x[4]={0,0,1,-1},y[4]={1,-1,0,0},total;
bool mark[100][100],flag;
char map[100][100];
void find(int d)
{
if(pre[d]!=0)find(pre[d]);
total++;
}
bool check(int x,int y)
{
if(x<n&&y<m&&x>=0&&y>=0)return 1;
return 0;
}
void bfs()
{
a[1]=beginx;
b[1]=beginy;
mark[beginx][beginy]=1;
pre[1]=0;
head=0;tail=1;
while(head!=tail)
{
head++;
for(int i=0;i<4;i++)
{
nextx=a[head]+x[i];
nexty=b[head]+y[i];
if(check(nextx,nexty)&&!mark[nextx][nexty]&&map[nextx][nexty]!='#')
{
tail++;
a[tail]=nextx;
b[tail]=nexty;
pre[tail]=head;
mark[nextx][nexty]=1;
if(a[tail]==endx&&b[tail]==endy)
{
find(tail);
printf("%d\n",total-1);
flag=1;
return ;
}
}
}
}
}
main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='S'){beginx=i;beginy=j;}
if(map[i][j]=='T'){endx=i;endy=j;}
}
}
if(beginx==endx&&beginy==endy)
{
printf("0\n");
return 0;
}
bfs();
if(!flag) printf("-1\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ bfs 函数 搜索 算法