题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1254
1254:走出迷宫
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 2502 通过数: 1154
【题目描述】
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
【输入】
第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。
【输出】
输出从起点到出口最少需要走的步数。
【输入样例】
3 3 S#T .#. ...
【输出样例】
6
解析:
常规BFS。
参考代码:
写得不大好,见谅。
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #define N 101 7 int n,m; 8 int a[N][N]; 9 int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; 10 struct node{ 11 int h,l; 12 int step; 13 }q[N*N*N]; 14 using namespace std; 15 void bfs(int i,int j) 16 { 17 int head=0,tail=1; 18 q[tail].step=0;q[tail].h=i;q[tail].l=j; 19 a[i][j]=1; 20 do 21 { 22 head++; 23 int x=q[head].l; 24 int y=q[head].h; 25 int step=q[head].step; 26 27 for(int i=0;i<4;i++) 28 { 29 int nx=x+dir[i][0]; 30 int ny=y+dir[i][1]; 31 if(a[ny][nx]==3)//到终点 32 { 33 printf("%d",step+1); 34 return; 35 } 36 if(nx>0&&nx<=m&&ny>0&&ny<=n&&a[ny][nx]!=1) 37 { 38 tail++; 39 a[ny][nx]=1; 40 q[tail].l=nx; 41 q[tail].h=ny; 42 q[tail].step=step+1; 43 } 44 } 45 }while(head<tail); 46 } 47 int main() 48 { 49 cin>>n>>m; 50 char c; 51 getchar();//这里贼坑 52 for(int i=1;i<=n;i++) 53 { 54 for(int j=1;j<=m;j++)//节省空间 55 { 56 scanf("%c",&c); 57 if(c=='S') a[i][j]=2; 58 if(c=='T') a[i][j]=3; 59 if(c=='#') a[i][j]=1; 60 if(c=='.') a[i][j]=0; 61 } 62 getchar();//这里也是贼坑 63 } 64 for(int i=1;i<=n;i++) 65 { 66 for(int j=1;j<=m;j++) 67 { 68 if(a[i][j]==2)//找到起点 69 { 70 bfs(i,j); 71 break; 72 } 73 } 74 } 75 76 return 0; 77 }
2019-04-18 19:39:34