POJ - 3009 dfs
阿新 • • 發佈:2018-12-07
初看此題直接上手bfs,但是卻忽略了一個嚴重的問題,比如地圖的改變,因為每一次出發都可能有四種狀態,如果四種狀態都能走,那麼可能會造成直接改變四處地圖樣貌,那麼再進行下一步走的時候地圖就會變成走了四個狀態的樣子,這樣解就肯定錯誤的。
由此想到可不可以走這一步只改變這一步的地圖樣子,然後走完這種的所有情況,再將地圖復原,由此想到遞歸回溯,程式碼如下:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const double epos=1e-8; const int maxn=29; int map1[maxn][maxn]; int num,ans; int n,m; struct Node{ int x,y; Node(int i=0,int j=0):x(i),y(j){}; void myset(int i,int j){x=i,y=j;} }st,en,out,in,ou; int check(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m&&map1[x][y]!=1) return 1; return 0; } void dfs(int x,int y,int num){ if(num>=10||(ans!=0&&num+1>=ans)) return ; //up if(check(x-1,y)){ for(int i=x-1;i>=0;i--){ if(map1[i][y]==1){ map1[i][y]=0; dfs(i+1,y,num+1); map1[i][y]=1; break; } if(map1[i][y]==3){ ans=num+1; return ; } } } //down if(check(x+1,y)){ for(int i=x+1;i<n;i++){ if(map1[i][y]==1){ map1[i][y]=0; dfs(i-1,y,num+1); map1[i][y]=1; break; } if(map1[i][y]==3){ ans=num+1; return ; } } } //lift if(check(x,y-1)){ for(int i=y-1;i>=0;i--){ if(map1[x][i]==1){ map1[x][i]=0; dfs(x,i+1,num+1); map1[x][i]=1; break; } if(map1[x][i]==3){ ans=num+1; return ; } } } //right if(check(x,y+1)){ for(int i=y+1;i<m;i++){ if(map1[x][i]==1){ map1[x][i]=0; dfs(x,i-1,num+1); map1[x][i]=1; break; } if(map1[x][i]==3){ ans=num+1; return ; } } } } int main(){ while(scanf("%d%d",&m,&n)!=EOF&&(n!=0||m!=0)){ num=0; ans=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ scanf("%d",&map1[i][j]); if(map1[i][j]==2) st.myset(i,j); } dfs(st.x,st.y,0); if(ans&&ans<=10) printf("%d\n",ans); else printf("-1\n"); } return 0; }