hdu - 1254 推箱子 (bfs+bfs)

时间:2025-03-27 23:06:25

http://acm.hdu.edu.cn/showproblem.php?pid=1254

题目意思很简单,只要思路对就好。

首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工需要到达的目的地,用另一个bfs判断,然后就类似两个点的bfs那样用一个数组标记状态,

需要注意箱子在边上的情况。

 #include<cstdio>
#include<cstring>
#include<queue>
using namespace std; struct point
{
int x,y,nx,ny,step;
}; int n,m;
int maze[][];
int used[][][][];
int dir[][]={{-,},{,},{,-},{,}}; bool bfs1(int a,int b,int c,int d,int p,int q)
{
int mark[][];
memset(mark,,sizeof(mark));
queue<point>que;
point s;
s.x=a,s.y=b;
mark[s.x][s.y]=;
que.push(s);
while(!que.empty())
{
point e=que.front();que.pop();
//printf("%d %d\n",e.x,e.y);
if(e.x==c&&e.y==d) return true;
for(int i=;i<;i++)
{
s.x=e.x+dir[i][];
s.y=e.y+dir[i][];
if(s.x==p&&s.y==q) continue;
//printf("%d %d\n",s.x,s.y);
if(s.x>=&&s.x<n&&s.y>=&&s.y<m&&maze[s.x][s.y]!=&&!mark[s.x][s.y])
{
mark[s.x][s.y]=;
que.push(s);
}
}
}
return false;
} void bfs2(int a,int b,int c,int d)
{
memset(used,,sizeof(used));
queue<point>que;
point s,e;
s.x=a,s.y=b,s.nx=c,s.ny=d,s.step=;
que.push(s);
used[s.x][s.y][s.nx][s.ny]=;
while(!que.empty())
{
e=que.front();que.pop();
//printf("%d %d %d %d %d\n",e.x,e.y,e.nx,e.ny,e.step);
if(maze[e.x][e.y]==) {printf("%d\n",e.step);return;}
for(int i=;i<;i++)
{
s.x=e.x+dir[i][];
s.y=e.y+dir[i][];
s.nx=e.x;
s.ny=e.y;
if(s.x<||s.x>=n||s.y<||s.y>=m||maze[s.x][s.y]==||used[s.x][s.y][s.nx][s.ny]) continue;
if(i==)
{
if(e.x+>=n||maze[e.x+][e.y]==||(bfs1(e.nx,e.ny,e.x+,e.y,e.x,e.y)==false)) continue;
}
else if(i==)
{
if(e.x-<||maze[e.x-][e.y]==||(bfs1(e.nx,e.ny,e.x-,e.y,e.x,e.y)==false)) continue;
}
else if(i==)
{
if(e.y+>=m||maze[e.x][e.y+]==||(bfs1(e.nx,e.ny,e.x,e.y+,e.x,e.y)==false)) continue;
}
else if(i==)
{
if(e.y-<||maze[e.x][e.y-]==||bfs1(e.nx,e.ny,e.x,e.y-,e.x,e.y)==false) continue;
}
used[s.x][s.y][s.nx][s.ny]=;
s.step=e.step+;
que.push(s);
}
}
printf("-1\n");
} int main()
{
//freopen("a.txt","r",stdin);
int t,a,b,c,d;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
scanf("%d",&maze[i][j]);
if(maze[i][j]==)
{
a=i;
b=j;
}
else if(maze[i][j]==)
{
c=i;
d=j;
}
}
bfs2(a,b,c,d);
}
return ;
}