迷宮 (資料結構作業)
阿新 • • 發佈:2018-12-02
演算法與資料結構實驗題 4.1 Maze
★實驗任務
有一隻小倉鼠身處在一個 N*M 迷宮之中,它現在想知道它最快能什麼時候到達出口。迷宮是由 ‘ . ’ ‘ # ’ 構成,’ . ’表示可以通行,‘#’表示牆壁,不能通行,現在小倉鼠在‘S’的位置上,問到出口’E’的最短時間是多少?
★資料輸入
第一行兩個整數 n,m(1<n,m<=1000)表示 n 行,m 列 接下來輸入一個 n*m 的迷宮(只包含 ’ . ’ , ’ # ’, ’ S ’,’ E ’)
★資料輸出
如果能到達則輸出最短時間,否則輸出-1
輸入示例 |
輸出示例 |
3 4 .... S.#. .#.E |
6 |
輸入示例 |
輸出示例 |
3 5 |
-1 |
..#.. |
|
#S#.E |
|
...#. |
|
解題思路:
寬度優先搜尋。。。
#include <cstdio> #include <queue> using namespace std; char maze[1005][1005]; int dis[1005][1005]; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; void BFS(int sx,int sy,int ex,int ey,int n,int m) { queue <pair <int,int> > q; pair <int,int> p; int x,y; dis[sx][sy]=0; p.first=sx,p.second=sy; q.push(p); while(!q.empty()) { p=q.front(); x=p.first; y=p.second; q.pop(); for (int i=0;i<4;i++) { if (x+dx[i]<0 || x+dx[i]>=n ||y+dy[i]<0 || y+dy[i]>=m) continue; if (maze[x+dx[i]][y+dy[i]]!='#' && dis[x+dx[i]][y+dy[i]]==-1) { dis[x+dx[i]][y+dy[i]]=dis[x][y]+1; p.first=x+dx[i],p.second=y+dy[i]; q.push(p); } if (x+dx[i]==ex&&y+dy[i]==ey) return ; } } } int main() { int n,m,sx,sy,ex,ey; scanf ("%d%d",&n,&m); for (int i=0;i<n;i++) { scanf ("%s",maze[i]); for (int j=0;j<m;j++) { dis[i][j]=-1; if (maze[i][j]=='S') { sx=i; sy=j; } else if (maze[i][j]=='E') { ex=i; ey=j; } } } BFS(sx,sy,ex,ey,n,m); printf ("%d\n",dis[ex][ey]); return 0; }