poj3984 迷宮問題 (bfs+方向轉移記錄軌跡)
阿新 • • 發佈:2018-11-09
參考資料
https://blog.csdn.net/xiaosshhaa/article/details/52134234
題解
題倒不難,空間夠,就暴力唄
自己寫的時候是,
一個node記錄一張蹤跡圖,
每走一步就新存一張圖,
記錄自己的行走路徑。
最後暴力dfs輸出軌跡。
心得
看了人家的程式碼,才深深認識到差距。
可以開一個num陣列,記錄偏轉方向。
即若j=3,則代表
這步xx=上步x+dx[3],
這步yy=上步y+dy[3],
最後按圖索驥,直接按陣列輸出num就好。
(前方路口左轉,下一個路口直行QAQ)
智障如我,總結如是。
程式碼
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <functional> const int INF=0x3f3f3f3f; const int maxn=1e5+10; const int mod=1e9+7; const int MOD=998244353; const double eps=1e-7; typedef long long ll; #define vi vector<int> #define si set<int> #define pii pair<int,int> #define pi acos(-1.0) #define pb push_back #define mp make_pair #define lowbit(x) (x&(-x)) #define sci(x) scanf("%d",&(x)) #define scll(x) scanf("%lld",&(x)) #define sclf(x) scanf("%lf",&(x)) #define pri(x) printf("%d",(x)) #define rep(i,j,k) for(int i=j;i<=k;++i) #define per(i,j,k) for(int i=j;i>=k;--i) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int maze[5][5]; int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; bool vis[5][5]; struct node { int flag[5][5]; int x,y,step; node(int xx,int yy,int ss):x(xx),y(yy),step(ss) { mem(flag,-1); } node(){ mem(flag,-1); } }; node ans; queue<node>q; bool check(int x,int y) { if(x>=0&&x<5&&y>=0&&y<5)return 1; return 0; } void load(node &a,node &b) { for(int i=0;i<5;++i) { for(int j=0;j<5;++j) { a.flag[i][j]=b.flag[i][j]; } } } void bfs() { node t(0,0,0); t.flag[0][0]=0; q.push(t); vis[0][0]=1; while(!q.empty()) { node tmp=q.front(); q.pop(); int x=tmp.x,y=tmp.y,s=tmp.step; if(x==4&&y==4) { load(ans,tmp); return; } for(int i=0;i<4;++i) { int xx=x+dx[i],yy=y+dy[i]; if(!check(xx,yy)||vis[xx][yy]||maze[xx][yy]==1)continue; node t(xx,yy,s+1); load(t,tmp); t.flag[xx][yy]=s+1; q.push(t); vis[xx][yy]=1; } } } void dfs(int x,int y) { printf("(%d, %d)\n",x,y); if(x==4&&y==4)return; for(int i=0;i<4;++i) { int xx=x+dx[i],yy=y+dy[i]; if(check(xx,yy)&&ans.flag[xx][yy]==ans.flag[x][y]+1) dfs(xx,yy); } } int main() { for(int i=0;i<5;++i) { for(int j=0;j<5;++j) { scanf("%d",&maze[i][j]); } } bfs(); dfs(0,0); return 0; }