POJ-3984 DFS+路經查詢+手動模擬佇列
阿新 • • 發佈:2018-11-21
#include<stdio.h> #include<iostream> using namespace std; int ma[5][5]; int dx[4]={0,-1,0,1}; int dy[4]={-1,0,1,0}; int start=0,last=1; struct node{ int x,y,pre; }vis[100]; void print(int i)//遞迴路徑查詢 { if(vis[i].pre!=-1) { print(vis[i].pre); cout<<"("<<vis[i].x<<", "<<vis[i].y<<")"<<endl; } } void bfs(int x1,int y1) { vis[start].x=x1; vis[start].y=y1; vis[start].pre=-1; while(start<last)//手動模擬佇列,建立子節點與父節點的聯絡,方便記錄路徑,遞迴實現路徑查詢 { for(int i=0;i<4;i++) { int a=dx[i]+vis[start].x; int b=dy[i]+vis[start].y; if(a<0||a>=5||b<0||b>=5||ma[a][b]) continue; else { ma[a][b]=1; vis[last].x=a; vis[last].y=b; vis[last].pre=start; last++; } if(a==4&&b==4) { print(start); } } start++; } } int main() { int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) cin>>ma[i][j]; cout<<"(0, 0)"<<endl; bfs(0,0); cout<<"(4, 4)"<<endl; /*for(int i = 1 ; i <= 16 ; i ++) cout<<vis[i].x<<" "<<vis[i].y<<endl;*/ return 0; }