3984 迷宮問題【bfs路徑列印】
阿新 • • 發佈:2018-12-11
K - 迷宮問題 POJ - 3984
定義一個二維陣列:
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)
思路:這就是一個簡單的bfs+路徑列印,初學的小夥伴可以注意一下路徑列印
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<iostream> #include<algorithm> using namespace std; int a[7][7]; int vis[7][7]; int X[5]= {0,1,-1,0,0}; int Y[5]= {0,0,0,-1,1}; int res=0x3f3f3f3f; struct node { int i; int j; int from; } path[100]; int len; queue<pair<pair<int,int>,int> >q;///通俗點說,這個定義了具有三個元素的結構體,故該佇列就為結構體佇列 int bfs(int x,int y) { vis[x][y]=1; path[len].i=x; path[len].j=y; path[len].from=-1; q.push(make_pair(make_pair(x,y),len)); while(!q.empty()) { int x1=q.front().first.first;///取結構體第一個元素 int y1=q.front().first.second;///取結構體第二個元素 int tmp=q.front().second;///取第三個元素 q.pop(); if(x1==4&&y1==4) { return tmp; } for(int i=1; i<5; i++) { int xx=x1+X[i]; int yy=y1+Y[i]; if(xx>=0&&xx<5&&yy>=0&&yy<5&&vis[xx][yy]==0&&a[xx][yy]==0) { len++; path[len].i=xx; path[len].j=yy; path[len].from=tmp; vis[xx][yy]=1; q.push(make_pair(make_pair(xx,yy),len)); } } } return -1; } void pri(int s) { int tmp=s; int t=0; int num[100]; num[t++]=tmp; while(path[tmp].from!=-1)///從後往前把所有路徑上經過的點都儲存到num陣列中 { num[t++]=path[tmp].from; tmp=path[tmp].from; } for(int k=t-1; k>=1; k--) printf("(%d, %d)\n",path[num[k]].i,path[num[k]].j); printf("(4, 4)\n"); } int main() { int n; while(~scanf("%d",&n)) { a[0][0]=n; memset(vis,0,sizeof(vis)); memset(path,0,sizeof(path)); while(!q.empty()) q.pop(); len=0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) { if(i==0&&j==0) continue; else scanf("%d",&a[i][j]); } int res=bfs(0,0); pri(res); } return 0; }