2-5-6264:走出迷宫

描述

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

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

3 3
S#T
.#.
...

样例输出

6
 1 #include<stdio.h>
 2 #include<string.h>
 3 int ni[4]={0,1,0,-1};
 4 int nj[4]={1,0,-1,0};
 5 int qu[10001][2],dep[10000];
 6 char a[101][101];
 7 int book[101][101];
 8 int m,n,i,j,k,si,sj,xi,xj,qi,qj,zi,zj,bu=0,ans;
 9 int main()
10 {
11     int h,t;
12     scanf("%d%d",&m,&n);
13     memset(book,0,sizeof(book));
14     for(i=1;i<=m;i++)
15         scanf("%s",a[i]);
16     for(i=1;i<=m;i++)
17         for(j=0;j<=n-1;j++)
18         {
19             if(a[i][j]=='S')    {qi=i;qj=j;book[i][j]=1;}
20             if(a[i][j]=='T')    {zi=i;zj=j;}
21         }
22         h=0;t=0;ans=-1;
23         memset(dep,0,sizeof(dep));
24         memset(qu,0,sizeof(qu));
25         qu[0][0]=qi;qu[0][1]=qj;
26         while(h<=t)
27         {
28             xi=qu[h][0];
29             xj=qu[h][1];
30             if(xi==zi&&xj==zj)
31             {
32                 ans=dep[h];
33                 break;
34             }
35             for(k=0;k<=3;k++)
36             {
37                 si=xi+ni[k];
38                 sj=xj+nj[k];
39                 if(si>=1&&si<=m&&sj>=0&&sj<=n-1)
40                     if(a[si][sj]!='#'&&book[si][sj]!=1)
41                     {
42                         qu[++t][0]=si;
43                         qu[t][1]=sj;
44                         dep[t]=dep[h]+1;
45                         book[si][sj]=1;
46                     }
47             }
48             h++;
49         }
50         printf("%d\n",ans);
51     return 0;
52 }

 

posted @ 2016-10-29 17:44  木樨  阅读(490)  评论(0编辑  收藏  举报