您的位置:首页 > 编程语言 > C语言/C++

hdu1254 推箱子(广搜bfs)

2015-10-19 20:29 239 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254

题目意思很简单,就是小时候玩过的推箱子游戏。但是这个要写成代码还是有很多东西需要考虑。

最主要的就是需要判断人能否走到箱子后面推动箱子,并且人不能穿越箱子。

对于这组数据

4 4

0 0 0 0

0 0 1 1

0 2 3 1

1 4 1 1

输出结果应该为3。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>

using namespace std;

struct node{
int x,y;
int step;
int px,py;
//int bs,by;
};

int dir[4][2]={0,1,1,0,0,-1,-1,0};
int n,m,spx,spy,sbx,sby;
int Map[10][10];

//判断人能否走到箱子后面的格子,px,py表示人的位置,
//X,Y表示箱子所在的位置,人不可以穿越箱子
//x,y表示想推箱子的反方向一格
bool Bfs1(int px,int py,int X,int Y,int x,int y)
{
queue<node>q;
node s,ss;
int vis[10][10]={0};
s.x=px;
s.y=py;
vis[px][py]=1;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==x&&s.y==y)
return true;
for(int i=0;i<4;i++)
{
int xx=s.x+dir[i][0];
int yy=s.y+dir[i][1];
if(!vis[xx][yy]&&xx>=0&&xx<n&&yy>=0&&yy<m&&(xx!=X||yy!=Y)&&Map[xx][yy]!=1)
{
ss.x=xx;
ss.y=yy;
vis[xx][yy]=1;
q.push(ss);
}
}
}
return false;
}

//推箱子,但是必须判断人能不能走到你想推箱子的反方向一格

int Bfs2()
{
queue<node>q;
int vis[10][10][5]={0};
node s,ss;
s.x=sbx;
s.y=sby;
s.px=spx;
s.py=spy;
s.step=0;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
if(Map[s.x][s.y]==3)
{
return s.step;
}
for(int i=0;i<4;i++)
{
int X=s.x+dir[i][0];
int Y=s.y+dir[i][1];
int XX=s.x-dir[i][0];
int YY=s.y-dir[i][1];
if(Bfs1(s.px,s.py,s.x,s.y,XX,YY)&&!vis[X][Y][i]&&X>=0&&X<n&&Y>=0&&Y<m&&Map[X][Y]!=1)
{
ss.x=X;
ss.y=Y;
ss.step=s.step+1;
ss.px=s.x;
ss.py=s.y;
vis[X][Y][i]=1;
q.push(ss);
}
}
}
return -1;
}

int main()
{
int t;
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",&Map[i][j]);
if(Map[i][j]==2)
sbx=i,sby=j,Map[i][j]=0;
if(Map[i][j]==4)
spx=i,spy=j,Map[i][j]=0;
}
}
printf("%d\n",Bfs2());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 bfs 代码