题目链接:http://noi.openjudge.cn/ch0205/6264/
- 总时间限制: 1000ms 内存限制: 65536kB
- 描述
-
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。 - 输入
-
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。 - 输出
- 输出从起点到出口最少需要走的步数。
- 样例输入
-
3 3 S#T .#. ...
- 样例输出
-
6
算法分析:典型的广搜。
1 #include<stdio.h> 2 #include<iostream> 3 #include<queue> 4 using namespace std; 5 6 struct obj 7 { 8 int xx,yy,step; 9 }; 10 11 int n,m; 12 char map[102][102]; 13 queue<struct obj> q; 14 struct obj S,T; 15 16 int dx[4]={-1,0,1,0};//上右下左 17 int dy[4]={0,1,0,-1}; 18 void BFS(); 19 20 int main(int argc, char *argv[]) 21 { 22 int i,j; 23 scanf("%d%d",&n,&m);getchar(); 24 for(i=0;i<n;i++) 25 { 26 for(j=0;j<m;j++) 27 { 28 map[i][j]=getchar(); 29 if(map[i][j]=='S') 30 { S.xx=i; S.yy=j; S.step=0; } 31 else if(map[i][j]=='T') 32 { T.xx=i; T.yy=j; T.step=-1; map[i][j]='.'; } 33 } 34 getchar(); 35 } 36 37 if(S.xx==T.xx&&S.yy==T.yy) printf("0\n"); 38 else BFS(); 39 printf("%d\n",T.step); 40 41 return 0; 42 } 43 44 void BFS() 45 { 46 int i,txx,tyy; 47 struct obj temp; 48 49 q.push(S); 50 while(!q.empty()) 51 { 52 for(i=0;i<4;i++) 53 { 54 txx=q.front().xx+dx[i]; 55 tyy=q.front().yy+dy[i]; 56 if(txx>=0&&txx<n&&tyy>=0&&tyy<m&&map[txx][tyy]=='.') 57 { 58 temp.xx=txx; 59 temp.yy=tyy; 60 temp.step=q.front().step+1; 61 map[txx][tyy]='#'; 62 q.push(temp); 63 if(temp.xx==T.xx&&temp.yy==T.yy) 64 { 65 T.step=temp.step; 66 return ; 67 } 68 } 69 } 70 q.pop(); 71 } 72 }