1254:走出迷宫

题目来源: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

上一篇:URL编码


下一篇:linux – 在用户命名空间中挂载Overlayfs