1. 程式人生 > 實用技巧 >pair求解迷宮的最短路徑(bfs)

pair求解迷宮的最短路徑(bfs)

題目描述:

問題:給定一個大小為N×M的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動到終點。 限制條件:N,M≦100
示例輸入:
10 10
#S######.# 
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
 

示例輸出:
22

 1 pair型別可以構造明確模板pair<T,U>物件,對組pair定義成結構體struct,而非類class
2 pair獲取第一個成員,可以使用first; 3 獲取第二個成員,可以使用second; 4 5 pair在標頭檔案<utility>中,宣告如下: 6 template <class Type1, class Type2> struct pair 7 { 8 typedef Type1 first_type; 9 typedef Type2 second_type; 10 Type1 first; 11 Type2 second; 12 pair(); 13 pair(const Type1& x, const
Type2& y); 14 template <class a, class b> pair(const pair<a,b>& _Right); 15 } 16 17 make_pair()模板函式無需寫型別,就可以生成一個pair物件,即將兩個值作為一個pair物件引數來傳遞 18 std::make_pair(42,'#'); 19 std::pair<int ,char>(42,'#');


 1 /*
 2 問題:給定一個大小為N×M的迷宮。迷宮由通道和牆壁組成,
 3 每一步可以向鄰接的上下左右四格的通道移動。請求出從起
4 點到終點所需的最小步數。請注意,本題假定從起點一定可 5 以移動到終點。 6 限制條件:N, M ≦100 7 8 示例輸入: 9 10 10 10 #S######.# 11 ......#..# 12 .#.##.##.# 13 .#........ 14 ##.##.#### 15 ....#....# 16 .#######.# 17 ....#..... 18 .####.###. 19 ....#...G# 20 21 示例輸出: 22 22 23 */ 24 25 #include <iostream> 26 #include <queue> 27 #include <utility> 28 using namespace std; 29 const int INF=1e8; 30 const int MAXN=1005; 31 int sx,sy; //起點座標 32 int gx,gy; //終點座標 33 char a[MAXN][MAXN]; //存迷宮的字元陣列 34 int vis[MAXN][MAXN]={0}; //到各個位置的最短距離設定初始化為INF 35 int N,M; 36 typedef pair<int,int> P; 37 int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}}; //4個方向的移動向量 38 39 bool in(int x,int y){ //判斷是否越界 40 return 0<=x&&x<N&&0<=y&&y<M; 41 } 42 //求從(sx,xy)到(gx,gy)的最短距離,無法到達就是INF 43 int bfs(){ 44 queue<P> q; 45 q.push(P(sx,sy)); //將起點加入佇列,並初始化距離為0 46 vis[sx][sy]=0; 47 while(q.size()){ 48 P p=q.front(); //從佇列取出第一個元素 49 q.pop(); 50 if(p.first==gx&&p.second==gy) break; //達到重點退出 51 for(int i=0;i<4;i++){ 52 int dx=p.first+dir[i][0]; 53 int dy=p.second+dir[i][1]; 54 if(in(dx,dy)&&a[dx][dy]!='#'&&vis[dx][dy]==INF){ 55 q.push(P(dx,dy)); 56 vis[dx][dy]=vis[p.first][p.second]+1; 57 } 58 } 59 } 60 return vis[gx][gy]; 61 } 62 void solve(){ 63 int sum=bfs(); 64 printf("%d",sum); 65 } 66 int main(){ 67 cin>>N>>M; 68 for(int i=0;i<N;i++){ 69 for(int j=0;j<M;j++){ 70 cin>>a[i][j]; 71 vis[i][j]=INF; 72 if(a[i][j]=='S'){ 73 sx=i; 74 sy=j; 75 } 76 if(a[i][j]=='G'){ 77 gx=i; 78 gy=j; 79 } 80 } 81 } 82 //scanf("%s",a); 83 solve(); 84 return 0; 85 }