http://acm.hdu.edu.cn/showproblem.php?pid=1307 题目半天看懂 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; #define N 11 struct node { int index[N]; }map[N*N*N][2]; int dir[4][2]={-1,0,0,-1,1,0,0,1}; int beg[N],end[N]; bool h[N*N*N][2]; int n,m; bool flag; bool find(int x,int y) { for(int i=0;i<n;i++) if(map[x][y].index[i]!=end[i]) return false; return true; } bool judge(int fx,int fy,int x,int y) { if(fx<0||fx>=m||fy<0||fy>1) return false; int ans=0; for(int i=0;i<n;i++) { int temp=(int)abs(1.0*map[fx][fy].index[i]-1.0*map[x][y].index[i]); if(temp==1) ans++; else if(temp>1) return false; } if(ans!=1) return false; return true; } void dfs(int x,int y) { if(find(x,y)) { flag=1; return; } if(flag) return; for(int i=0;i<4;i++) { int fx=x+dir[i][0]; int fy=y+dir[i][1]; if(judge(fx,fy,x,y)&&!h[fx][fy]) { h[fx][fy]=1; dfs(fx,fy); if(flag) return; } } } int main(void) { int k=1; while(scanf("%d",&n),n) { int x,y; int i; for(i=0;i<n;i++) scanf("%d",&beg[i]); for(i=0;i<n;i++) scanf("%d",&end[i]); m=0; while(scanf("%d",&map[m][0].index[0])) { if(map[m][0].index[0]==-1) break; for(i=1;i<n;i++) scanf("%d",&map[m][0].index[i]); for(i=0;i<n;i++) scanf("%d",&map[m][1].index[i]); for(i=0;i<n;i++) if(map[m][0].index[i]!=beg[i]) break; if(i<n) { x=m; y=i; } for(i=0;i<n;i++) if(map[m][1].index[i]!=beg[i]) break; if(i<n) { x=m; y=i; } m++; } memset(h,0,sizeof(h)); flag=0; dfs(x,y); printf("Maze #%d ",k++); if(flag) printf("can"); else printf("cannot"); printf(" be travelled/n"); } }