poj 3984迷宮問題(bfs求最短路徑 類似並查集儲存上個節點 儲存最短路徑)
阿新 • • 發佈:2019-01-07
迷宮問題
它表示一個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
左上角到右下角的最短路徑,格式如樣例所示。
Time Limit: 1000MS | Memory Limit: 65536K |
Total Submissions: 16343 | Accepted: 9762 |
Description
定義一個二維陣列:int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
Input
一個5 × 5的二維陣列,表示一個迷宮。資料保證有唯一解。Output
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
#include<iostream> #include<string> #include<queue> #include<cstring> #include<cstdio> using namespace std; int k=0; int pre[30]; int map[7][7]; int vis[7][7]; int dx[]={ 0,0,-1,1 }; int dy[]={ 1,-1,0,0 }; void pp() { int a[30]; int u=24; int t=0; while(1) { a[t++]=pre[u];//找到路徑 當回到起點時退出 u=pre[u]; if(u==0) break; } for(int i=t-1;i>=0;i--) { printf("(%d, %d)\n",a[i]/5,a[i]%5);//餘數表示y座標 整除部分表示x座標 } printf("(4, 4)\n"); return ; } typedef pair<int,int> pa; void bfs(int p,int q) { queue<pa> que; vis[p][q]=1; que.push(pa(p,q)); while(!que.empty()) { pa now=que.front(); que.pop(); int x=now.first; int y=now.second; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx<0||xx>=5||yy<0||yy>=5||vis[xx][yy]==1||map[xx][yy]==1) continue; else{ pre[5*xx+yy]=5*x+y;//模仿並查集 儲存父節點 從終點開始往回追溯 if(xx==4&&yy==4) { pp(); return; } vis[xx][yy]=1; que.push(pa(xx,yy)); } } } return ; } int main() { memset(vis,0,sizeof(vis)); for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { scanf("%d",&map[i][j]); } } bfs(0,0); return 0; }