http://acm.hdu.edu.cn/showproblem.php?pid=1254 还是要细心那!! #include<iostream> #include<queue> using namespace std; #define N 8 int map[N][N]; bool h[N][N][N][N]; bool mark[N][N]; int n,m; struct node { int px,py; int bx,by; int step; }; int bx,by; int px,py; int dir[4][2]={-1,0,0,-1,1,0,0,1}; bool flag; void SET(node p) { h[p.px][p.py][p.bx][p.by]=1; } bool GET(node p) { return h[p.px][p.py][p.bx][p.by]; } bool judge(node p) { if(p.bx>=0&&p.bx<n&&p.by>=0&&p.by<m&&map[p.bx][p.by]!=1) return true; return false; } void dfs(int s,int t,int x,int y,node p) { if(x<0||x>=n||y<0||y>=m) return; if(s==x&&t==y) { flag=1; return; } if(flag) return; for(int i=0;i<4;i++) { int fx=s+dir[i][0]; int fy=t+dir[i][1]; if(fx>=0&&fx<n&&fy>=0&&fy<m&&(fx!=p.bx||fy!=p.by)&&map[fx][fy]!=1&&!mark[fx][fy])//要保证人走的时候不能走到箱子那格去 { mark[fx][fy]=1; dfs(fx,fy,x,y,p); if(flag) return; } } } void bfs() { queue<node> q; node p,temp; p.bx=bx;p.by=by; p.px=px;p.py=py; p.step=0; q.push(p); SET(p); while(!q.empty()) { temp=q.front(); q.pop(); if(map[temp.bx][temp.by]==3) { printf("%d/n",temp.step); return; } for(int i=0;i<4;i++) { p=temp; p.step++; p.bx+=dir[i][0]; p.by+=dir[i][1]; memset(mark,0,sizeof(mark)); mark[p.px][p.py]=1; int ppx=temp.bx-dir[i][0]; int ppy=temp.by-dir[i][1]; flag=0; dfs(p.px,p.py,ppx,ppy,temp); if(judge(p)&&flag) { p.px=temp.bx; p.py=temp.by; if(!GET(p)) { SET(p); q.push(p); } } } } printf("-1/n"); } int main(void) { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) { bx=i;by=j; } else if(map[i][j]==4) { px=i;py=j; } } memset(h,0,sizeof(h)); bfs(); } } 小心再小心!!!