Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6758 Accepted Submission(s): 1906
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.
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<stdio.h>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int map[10][10],mark[10][10][10][10];
int n,m,flag,markk[10][10];
int xiangx,xiangy;
struct dian
{
int x,y;
int renx,reny;
int step;
}st,end;
struct ren
{
int x,y;
}vv,stt;
int bffs(ren stt)
{
queue<ren>q;
markk[stt.x][stt.y]=1;
q.push(stt);
ren v,vn;
while(!q.empty())
{
vn=q.front();
q.pop();
if(vn.x==vv.x&&vn.y==vv.y)
return 1;//可以到达现在推箱子的位置
for(int i=0;i<4;i++)
{
v.x=vn.x+dx[i];
v.y=vn.y+dy[i];
if(v.x>=n||v.x<0||v.y>=m||v.y<0)
continue;//不能出界
if(map[v.x][v.y]==1) continue;
if(v.x==xiangx&&v.y==xiangy) continue;
//不能在以前箱子所在的位置
if(markk[v.x][v.y]) continue;
markk[v.x][v.y]=1;
q.push(v);
}
}
return 0;
}
void bfs(dian st)
{
queue<dian>p;
p.push(st);//使用人还有箱子的位置实现四维标记
mark[st.x][st.y][st.renx][st.reny]=1;
dian v,vn;
while(!p.empty())
{
vn=p.front();
p.pop();
if(vn.x==end.x&&vn.y==end.y)
{//如果现在箱子被推到了指定的位置
flag=1;
printf("%d\n",vn.step);
return;
}
for(int i=0;i<4;i++)
{//箱子位置变更
v.x=vn.x+dx[i];
v.y=vn.y+dy[i];
v.step=vn.step+1;
v.renx=vn.x;
v.reny=vn.y;
vv.x=vn.x-dx[i];//vv中的x,y存储了推箱子时人应该在的位置
vv.y=vn.y-dy[i];
if(v.x>=n||v.x<0||v.y>=m||v.y<0) continue;
if(map[v.x][v.y]==1) continue;
if(map[vv.x][vv.y]==1||vv.x>=n||vv.x<0||vv.y>=m||vv.y<0) continue;
if(mark[v.x][v.y][v.renx][v.reny]) continue;
stt.x=vn.renx;//结构体中存放的有当时人的位置
stt.y=vn.reny;
xiangx=vn.x;
xiangy=vn.y;
memset(markk,0,sizeof(markk));
if(!bffs(stt)) continue;//箱子被推之前的位置,因为还要判定是否可以推
mark[v.x][v.y][v.renx][v.reny]=1;
p.push(v);
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
flag=0;
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)
{
st.x=i;
st.y=j;
xiangx=i;
xiangy=j;
}
if(map[i][j]==3)
{
end.x=i;
end.y=j;
}
if(map[i][j]==4)
{
st.renx=i;
st.reny=j;
}
}
st.step=0;
memset(mark,0,sizeof(mark));
memset(markk,0,sizeof(markk));
bfs(st);
if(!flag) printf("-1\n");
}
return 0;
}