hdu 1254(两个BFS) 推箱子
http://acm.hdu.edu.cn/showproblem.php?pid=1254
首先,要判断人是不是可以从4到达箱子的位置2,而且不止判断一次,因为推动箱子一步后,人的位置也会改变,所以每次移动箱子前都要判断
所以这里要用两个搜索,当每朝着一个方向移动一步箱子的时候,就需要判断 从 此刻的 人位置能不能到达箱子反方向的那个位置(人只能推箱子,
不能拉什么的) 注意人在移动的时候箱子对于人来说也算障碍物,这里需要开一个hash1的四维数组记录走过的位置,不然会死循环超时间
这个记录的数组不要叫做hash啊,因为像hash,max,min什么的都是有自定义的特殊含义的名称,然后我们不用他的自定义的含义的话OJ编译器
会识别不出而报错,我就是刚开始没注意 结果CE了一面
code
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct node {
int wx,wy;
};
struct point{
int x,y;//记录箱子的位置
int step;
int renx,reny; //记录人得位置
};
int n,m,rx,ry,xx,xy;
int hash1[][][][];
int map[][],visit[][];
int dx[]={,-,,};
int dy[]={,,,-};
int bfs1(int q,int p,int x,int y)//搜索人是否能到箱子那里
{
int i;
queue<node>Q;
node now,next;
now.wx=q;now.wy=p;
Q.push(now);
while (!Q.empty())
{
now=Q.front();
Q.pop();
if (now.wx==x&&now.wy==y)
return ;
for (i=;i<;i++)
{
next.wx=now.wx+dx[i];
next.wy=now.wy+dy[i];
if (next.wx<||next.wx>n||next.wy<||next.wy>m)continue;
if (map[next.wx][next.wy]==)continue;
if (visit[next.wx][next.wy]==)continue;
visit[next.wx][next.wy]=;
Q.push(next);
}
}
return -;
}
int bfs2()
{
int i,q,p;
queue<point>Q;
point now,next;
now.x=xx;now.y=xy;
now.renx=rx;now.reny=ry;
now.step=;
Q.push(now);
while (!Q.empty())
{
now=Q.front();
Q.pop();
if (map[now.x][now.y]==)
return now.step;
for (i=;i<;i++)
{
q=now.x-dx[i];
p=now.y-dy[i];
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if (q<||q>n||p<||p>m)continue;
if (map[q][p]==)continue;
if (hash1[next.x][next.y][q][p]!=)continue;
if (next.x<||next.x>n||next.y<||next.y>m)continue;
if (map[next.x][next.y]==)continue;
memset(visit,,sizeof(visit));
visit[now.x][now.y]=;visit[q][p]=;
if (bfs1(q,p,now.renx,now.reny)==-)continue;
next.renx=q;next.reny=p;
next.renx=now.x;next.reny=now.y;
hash1[next.x][next.y][q][p]=;
next.step=now.step+;
Q.push(next);
}
}
return -;
}
int main()
{
int t,i,j;
while (~scanf("%d",&t))
{
while (t--)
{
memset(hash1,,sizeof(hash1));
scanf("%d %d",&n,&m);
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
scanf("%d",&map[i][j]);
if (map[i][j]==)
rx=i,ry=j;
if (map[i][j]==)
xx=i,xy=j;
}
}
printf("%d\n",bfs2());
}
}
return ;
}
hdu 1254(两个BFS) 推箱子的更多相关文章
- c语言游戏推箱子
前两天做了推箱子小游戏,看似简单的一个小游戏背后却 有巨大的秘密,这秘密就是一大堆逻辑. 自从学习了函数过后,的确是解决了很多问题,而且调用很方便,尽管我现在都不是很会调用. 写完一个函数,准备测试一 ...
- HDU 1254 推箱子 BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
- HDU 1254 推箱子(BFS加优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- hdu - 1254 推箱子 (bfs+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1254 推箱子游戏(搞了一下午。。。)
中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- C#转成时间格式
public static string GetDatetime() { System.Globalization.DateTimeFormatInfo myDTF ...
- 获取当前ip
测ip地址http://2018.ip138.com/ic.asphttps://www.ip.cn/
- tensorflow 训练cifar10报错
1.AttributeError: 'module' object has noattribute 'random_crop' 解决方案: 将distorted_image= tf.image.ran ...
- soap 简单调用其他系统的函数
<?xml version ='1.0' encoding ='UTF-8' ?> <definitions name='自定义名称' targetNamespace='目标命名空间 ...
- Parallax Mapping
[Parallax Mapping] Parallax mapping belongs to the family of displacement mapping techniques that di ...
- Mybatis批量更新和插入
<update id="updateOrInsert"> <foreach collection="list" index="ind ...
- sql数据库之多库查询
连接到数据库服务器gwsps07上,打开查询分析器,如何获取gwrenshi数据库中的数据? 查询语句如下: select * from GWRENSHI.CGC.dbo.PERempms(serve ...
- sqlmap自动注入
基于python2.7开发 git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
- maven项目下出现java.lang.ClassNotFoundException: ContextLoader异常
原因:出现此异常是因为tomcat的webapp目录下没有lib文件. 解决方案: 1.右键点击项目--选择Properties选择Deployment Assembly,在右边点击Add按钮,在弹出 ...
- SpringMVC包括哪些组件
1 映射器 1.1作用:Handlermapping根据url查找Handler 2 适配器 2.1作用:HandlerAdapter执行Handler 3 解析器 3.1作用:View ...