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 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- centos7.x修改网卡名字
1.编辑/etc/default/grub 加入如下代码 net.ifnames=0 biosdevname=0 2. 在执行以下 grub2-mkconfig -o /boot/grub2/gru ...
- Linux 安装nginx 及配置
安装openssl库 # yum install -y openssl openssl-devel 安装gcc # yum install gcc-c++ 安装 PCRE # yum ...
- 解决SMARTFORMS文本编辑器不能打开
在DEV打开SMARTFORMS文本编辑器时,出现如下错误 由于宏安全设置,无法找到宏或宏被禁用. 解决方法如下: 在DEV环境新建程序后输入如下代码执行即可. *&------------- ...
- 1.3.5、CDH 搭建Hadoop在安装之前(端口---Cloudera Search使用的端口)
Cloudera Search使用的端口 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外部通信. ...
- linux下mysql升级
最近漏洞扫描,扫描出了数据库存在中高危漏洞,于是迫切需要进行数据库升级.上网查了各种资料,说法很多,也到自己虚拟机上试了好多方法,终于倒腾出来,做下小总结记录一下. 升级操作: 1.到mysql官网h ...
- Appium1.6 GUI界面介绍
Appium1.6安装详见随笔:http://www.cnblogs.com/meitian/p/7360017.html 下面具体介绍一下GUI界面 1.appium server配置页面 2. ...
- 【翻译】 View Frustum Culling --1 View Frustum’s Shape
这是一些列来自lighthouse3d的视锥体裁剪教程.旨在学习总结,及便于查阅. 1.视锥体的形状 在OpenGL中,透视投影是由两个函数定义的gluPerspective和gluLookAt.我们 ...
- springboot1 缓存前端
@Configurationpublic class WebMvcConfig extends WebMvcConfigurerAdapter { public void addResourceHan ...
- jdk各版本名称
- mysql分组GROUP BY常用sql
数据分组 GROUP BY GROUP BY可以根据一个或多个字段进行分组. 比如,根据prod_id分组: SELECT prod_id ,user_id FROM products GROUP B ...