您的位置:首页 > 其它

hdu - 1254 推箱子 (bfs+bfs)

2015-05-30 20:26 501 查看
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[10][10];
int used[10][10][10][10];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

bool bfs1(int a,int b,int c,int d,int p,int q)
{
int mark[10][10];
memset(mark,0,sizeof(mark));
queue<point>que;
point s;
s.x=a,s.y=b;
mark[s.x][s.y]=1;
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=0;i<4;i++)
{
s.x=e.x+dir[i][0];
s.y=e.y+dir[i][1];
if(s.x==p&&s.y==q) continue;
//printf("%d %d\n",s.x,s.y);
if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&maze[s.x][s.y]!=1&&!mark[s.x][s.y])
{
mark[s.x][s.y]=1;
que.push(s);
}
}
}
return false;
}

void bfs2(int a,int b,int c,int d)
{
memset(used,0,sizeof(used));
queue<point>que;
point s,e;
s.x=a,s.y=b,s.nx=c,s.ny=d,s.step=0;
que.push(s);
used[s.x][s.y][s.nx][s.ny]=1;
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]==3) {printf("%d\n",e.step);return;}
for(int i=0;i<4;i++)
{
s.x=e.x+dir[i][0];
s.y=e.y+dir[i][1];
s.nx=e.x;
s.ny=e.y;
if(s.x<0||s.x>=n||s.y<0||s.y>=m||maze[s.x][s.y]==1||used[s.x][s.y][s.nx][s.ny]) continue;
if(i==0)
{
if(e.x+1>=n||maze[e.x+1][e.y]==1||(bfs1(e.nx,e.ny,e.x+1,e.y,e.x,e.y)==false)) continue;
}
else if(i==1)
{
if(e.x-1<0||maze[e.x-1][e.y]==1||(bfs1(e.nx,e.ny,e.x-1,e.y,e.x,e.y)==false)) continue;
}
else if(i==2)
{
if(e.y+1>=m||maze[e.x][e.y+1]==1||(bfs1(e.nx,e.ny,e.x,e.y+1,e.x,e.y)==false)) continue;
}
else if(i==3)
{
if(e.y-1<0||maze[e.x][e.y-1]==1||bfs1(e.nx,e.ny,e.x,e.y-1,e.x,e.y)==false) continue;
}
used[s.x][s.y][s.nx][s.ny]=1;
s.step=e.step+1;
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=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&maze[i][j]);
if(maze[i][j]==2)
{
a=i;
b=j;
}
else if(maze[i][j]==4)
{
c=i;
d=j;
}
}
bfs2(a,b,c,d);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: