题目链接:https://www.dotcpp.com/oj/problem1672.html
问题 1672: 迷宫问题
时间限制: 1Sec 内存限制: 32MB 提交: 663 解决: 158
题目描述
小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。
小明只能向上下左右四个方向移动。
输入
输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。
输出
对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。
样例输入
1 5 5 S-### ----- ##--- E#--- ---##
样例输出
9
宽度优先搜索的常规题,但是需要注意判断:如果不存在通路需要返回-1(否则只能过50%,存在一半的数据);
1 #include <iostream>
2 #include <algorithm>
3 #include <cmath>
4 #include <string>
5 #include <cstring>
6 #include <map>
7 #include <cstdio>
8 #include <queue>
9 using namespace std;
10 const int INF=0x3f3f3f3f;
11 typedef pair<int,int> P;
12 char maze[105][105];
13 int N,M;
14 int sx,sy;
15 int gx,gy;
16 int d[105][105];
17 int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
18 int t;
19 int bfs()
20 {
21 queue<P> que;
22 for(int i=0;i<N;i++){
23 for(int j=0;j<M;j++){
24 d[i][j]=INF;
25 }
26 }
27 que.push(P(sx,sy));
28 d[sx][sy]=0;
29 while(que.size()){
30 P p=que.front();
31 que.pop();
32 if(p.first==gx&&p.second==gy) break;
33 for(int i=0;i<4;i++){
34 int nx=p.first+dx[i],ny=p.second+dy[i];
35 if(nx>=0&&nx<N&&ny>=0&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
36 que.push(P(nx,ny));
37 d[nx][ny]=d[p.first][p.second]+1;
38 }
39 }
40 }
41 if(d[gx][gy]==INF) return -1;
42 else return d[gx][gy];
43 }
44 int main()
45 {
46 while(cin>>t){
47 while(t--){
48 cin>>N>>M;
49 for(int i=0;i<N;i++){
50 for(int j=0;j<M;j++){
51 cin>>maze[i][j];
52 if(maze[i][j]=='S'){
53 sx=i;
54 sy=j;
55 }
56 if(maze[i][j]=='E'){
57 gx=i;
58 gy=j;
59 }
60 }
61 }
62 cout<<bfs()<<endl;
63 }
64 }
65 return 0;
66 }
。。。
1 #include <iostream>
2 #include <algorithm>
3 #include <string>
4 #include <cstring>
5 #include <queue>
6 using namespace std;
7 const int INF=0x3f3f3f3f;
8 typedef pair<int,int> P;
9 int t,n;
10 int N,M;
11 int d[105][105];
12 char a[105][105];
13 int dx[4]={1,-1,0,0};
14 int dy[4]={0,0,1,-1};
15 int sx,sy,gx,gy;
16 int x,y,nx,ny;
17 int bfs()
18 {
19 memset(d,INF,sizeof(d));
20 queue<P> que;
21 que.push(P(sx,sy));
22 d[sx][sy]=0;
23 while(!que.empty()){
24 P p=que.front();
25 que.pop();
26 x=p.first,y=p.second;
27 if(x==gx&&y==gy) break;
28 for(int i=0;i<4;i++){
29 nx=x+dx[i],ny=y+dy[i];
30 if(nx>=0&&nx<N&&ny>=0&&ny<M&&a[nx][ny]!='#'&&d[nx][ny]==INF){
31 que.push(P(nx,ny));
32 d[nx][ny]=d[x][y]+1;
33 }
34 }
35 }
36 if(d[gx][gy]==INF) return -1;
37 return d[gx][gy];
38 }
39 int main()
40 {
41 while(cin>>t){
42 while(t--){
43 cin>>N>>M;
44 for(int i=0;i<N;i++){
45 for(int j=0;j<M;j++){
46 cin>>a[i][j];
47 if(a[i][j]=='S'){
48 sx=i,sy=j;
49 }else if(a[i][j]=='E'){
50 gx=i,gy=j;
51 }
52 }
53 }
54 cout<<bfs()<<endl;
55 }
56 }
57 return 0;
58 }
来源:https://www.cnblogs.com/shixinzei/p/10747024.html