题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254
1 5 5 0 3 0 0 0 1 0 1 4 0 0 0 1 0 0 1 0 2 0 0 0 0 0 0 0
4
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int n,m; int Map[110][110]; int dir[4][2]= {0,1,0,-1,1,0,-1,0}; struct node { int rx,ry; int bx,by; int step; }; bool bfsr(int rx,int ry,int ex,int ey,int bx,int by)//对人进行搜索 { int vis[10][10]= {0}; node s,ss; queue<node>q,qq; s.rx=rx; s.ry=ry; s.step=0; vis[s.rx][s.ry]=1; q.push(s); while (!q.empty()) { s=q.front(); q.pop(); if (s.rx==ex&&s.ry==ey) return 1; for (int i=0; i<4; i++) { int X=s.rx+dir[i][0]; int Y=s.ry+dir[i][1]; if (X>=0&&X<n&&Y>=0&&Y<m&&Map[X][Y]!=1&&!(X==bx&&Y==by)&&!vis[X][Y]) { ss.rx=X; ss.ry=Y; ss.step=s.step+1; vis[ss.rx][ss.ry]=1; q.push(ss); } } } return 0; } void bfsx(int sx,int sy,int ex,int ey,int rx,int ry)//对箱子进行搜索 { node s,ss; queue<node>q,qq; s.bx=sx; s.by=sy; s.step=0; s.rx=rx; s.ry=ry; int vis[10][10][10]= {0}; //vis[s.bx][s.by][]=1; q.push(s); while (!q.empty()) { s=q.front(); q.pop(); if (s.bx==ex&&s.by==ey) { printf ("%d\n",s.step); return ; } for (int i=0; i<4; i++) { int X=s.bx+dir[i][0];//箱子将要去的地方 int Y=s.by+dir[i][1]; int Xx=s.bx-dir[i][0];//人应该到达的地方 int Yy=s.by-dir[i][1]; if (X>=0&&X<n&&Y>=0&&Y<m&&Map[X][Y]!=1&&!vis[X][Y][i]&&bfsr(s.rx,s.ry,Xx,Yy,s.bx,s.by)==1)//判断是否可以去 { //cout<<s.bx<<" "<<s.by<<" "<<s.rx<<" "<<s.ry<<endl; ss.bx=X; ss.by=Y; ss.rx=s.bx; ss.ry=s.by; ss.step=s.step+1; vis[ss.bx][ss.by][i]=1; q.push(ss); } } } printf ("-1\n"); } int main() { int t; scanf("%d",&t); while (t--) { int rx,ry,bx,by,ex,ey; 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]==4) rx=i,ry=j,Map[i][j]=0; if (Map[i][j]==2) bx=i,by=j,Map[i][j]=0; if (Map[i][j]==3) ex=i,ey=j; } } bfsx(bx,by,ex,ey,rx,ry); } return 0; }