POJ 3009 Curling 2.0
暴力DFS。
注意行列不要打错。。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=30; int n,m; int a[maxn][maxn]; int ans; int dir[4][2]= { {1,0}, {-1,0}, {0,-1}, {0,1}, }; void dfs(int x,int y,int cnt) { if(cnt>10) return; if(cnt>=ans) return; if(a[x][y]==3) {ans=min(ans,cnt);return;} for(int i=0; i<4; i++) { int tmpx=x+dir[i][0],tmpy=y+dir[i][1]; bool su=0; while(1) { if(tmpx<1||tmpx>n) break; else if(tmpy<1||tmpy>m) break; else if(a[tmpx][tmpy]==3) { dfs(tmpx,tmpy,cnt+1); break; } else if(a[tmpx][tmpy]==1) { if(su==1) { a[tmpx][tmpy]=0; dfs(tmpx-dir[i][0],tmpy-dir[i][1],cnt+1); a[tmpx][tmpy]=1; } break; } tmpx=tmpx+dir[i][0]; tmpy=tmpy+dir[i][1]; su=1; } } } int main() { // freopen("G:\\in.txt","r",stdin); // freopen("G:\\out.txt","w",stdout); while(~scanf("%d%d",&m,&n)) { if(!n&&!m) break; memset(a,0,sizeof a); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&a[i][j]); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(a[i][j]==2) { ans=0x7FFFFFFF; dfs(i,j,0); } } } if(ans==0x7FFFFFFF) ans=-1; printf("%d\n",ans); } return 0; }