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

来源:互联网 发布:深圳程序员工资2016 编辑:程序博客网 时间:2024/06/06 09:20


走出迷宫

Description

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

Input
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
Output
输出从起点到出口最少需要走的步数。

Sample Input

3 3S#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");}

原创粉丝点击