题目链接:http://ica.openjudge.cn/dg3/3/
- 总时间限制: 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<queue> 3 #include<iostream> 4 using namespace std; 5 6 struct obj 7 { 8 int x,y; 9 int step;//表示从出发点到达(x,y)需要的步数 10 }; 11 12 char a[102][102]; 13 queue<struct obj> que; 14 struct obj start,destination; 15 int dx[4]={-1,0,1,0};//上右下左 16 int dy[4]={0,1,0,-1}; 17 18 int main(int argc, char *argv[]) 19 { 20 int n,m,i,j,xx,yy; 21 struct obj temp,temp2; 22 23 scanf("%d%d",&n,&m); 24 for(i=0;i<n;i++) 25 scanf("%s",a[i]); 26 for(i=0;i<n;i++) 27 { 28 for(j=0;j<m;j++) 29 { 30 if(a[i][j]=='S') { start.x=i; start.y=j; start.step=0; } 31 else if(a[i][j]=='T') { destination.x=i; destination.y=j; a[i][j]='.'; } 32 //printf("%c",a[i][j]); 33 } 34 //printf("\n"); 35 } 36 //printf("%d %d %d\n",start.x,start.y,start.step); 37 //printf("%d %d %d\n",destination.x,destination.y,destination.step); 38 39 a[start.x][start.y]='#'; 40 que.push(start); 41 while(!que.empty()) 42 { 43 temp=que.front();que.pop(); 44 //printf("%d %d %d ",temp.x,temp.y,temp.step); 45 //printf("%d %d %d\n",destination.x,destination.y,destination.step); 46 if(temp.x==destination.x&&temp.y==destination.y) 47 { 48 destination.step=temp.step; 49 break; 50 } 51 52 for(i=0;i<4;i++) 53 { 54 xx=temp.x+dx[i]; 55 yy=temp.y+dy[i]; 56 if(xx>=0&&xx<n&&yy>=0&&yy<m&&a[xx][yy]=='.') 57 { 58 a[xx][yy]='#'; 59 temp2.x=xx; 60 temp2.y=yy; 61 temp2.step=temp.step+1; 62 que.push(temp2); 63 } 64 } 65 } 66 printf("%d\n",destination.step); 67 return 0; 68 }