Description
推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
![](https://i-blog.csdnimg.cn/blog_migrate/9cd43be9c80ad0a119b921c7d0d1855d.jpeg)
Input
输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.
Output
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.
Sample Input
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
Sample Output
4#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; int m,n; int dx[4]= {0,1,0,-1}; int dy[4]= {1,0,-1,0}; int maze[10][10],cnt[10][10],q[100000],flower[100005][2]; int vis[10][10][5],dis[10][10]; void dfs(int x,int y) { if(maze[x][y]==1||dis[x][y]==1||x<0||y<0||x==m||y==n) return; dis[x][y]=1; dfs(x-1,y); dfs(x+1,y); dfs(x,y-1); dfs(x,y+1); } int bfs(int x,int y,int endx,int endy,int a,int b) { int fr=0,re=0,d,u; u=x*n+y; cnt[x][y]=0; q[re]=u; flower[re][0]=a; flower[re++][1]=b; while(fr<re) { u=q[fr++]; x=u/n; y=u%n; for(d=0; d<4; d++) { memset(dis,0,sizeof(dis)); int nx=x+dx[d],ny=y+dy[d]; dis[x][y]=1; dfs(flower[fr-1][0],flower[fr-1][1]); if(x-dx[d]>=0&&y-dy[d]>=0) { if(dis[x-dx[d]][y-dy[d]]) { if(nx>=0&&nx<m&&ny>=0&&ny<n&&maze[nx][ny]!=1&&vis[nx][ny][d]==0) { vis[nx][ny][d]=1; int v=nx*n+ny; q[re]=v; flower[re][0]=x; flower[re++][1]=y; cnt[nx][ny]=cnt[x][y]+1; if(nx == endx && ny == endy) return cnt[endx][endy]; } } } } } return -1; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); memset(maze,0,sizeof(maze)); memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); int i,j,x,y,endx,endy,px,py; for(i=0; i<m; i++) for(j=0; j<n; j++) { scanf("%d",&maze[i][j]); if(maze[i][j]==2) { x=i; y=j; } if(maze[i][j]==3) { endx=i; endy=j; } if(maze[i][j]==4) { px=i; py=j; } } printf("%d\n",bfs(x,y,endx,endy,px,py)); } return 0; }