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 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- WilliamChart各种图表效果实现大全《IT蓝豹》
WilliamChart各种图表效果实现大全,有水平线条表格,有柱状表格等.由LineFragment,BarFragment,StackedFragment,SandboxFragment几个fra ...
- yii NAV x下拉
$menuItems[] = [ 'label' => "<img src='/images/small.jpg'>", 'url' => ['/site/ ...
- Alpine Linux 使用简介
https://blog.csdn.net/csdn_duomaomao/article/details/76152416
- SSM框架简介及整合教程
1.Spring Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (控制反转) 和 A面向切面编程).Spring框架是个轻量级的Java E ...
- 在Laravel外独立使用laravel-mongodb
laravel框架外部使用laravel-mongodb 插件 下载安装方式主要根据github上的参考: https://github.com/jenssegers/laravel-mongodb# ...
- 10大H5前端框架(转)
10大H5前端框架 作为一名做为在前端死缠烂打6年并且懒到不行的攻城士,这几年我还是阅过很多同门从知名到很知名的各种前端框架,本来想拿15-20个框架来分享一下,但在跟几个前辈讨教写文章的技巧时果断被 ...
- myeclipse2014安装aptana3.4.0插件(转)
1.下载aptana3.4.0_eclipse的zip包 http://pan.baidu.com/s/1qXOiZl6 或者是:https://pan.baidu.com/s/1jIqOYcI 2 ...
- vmware 共享文件夹
参考 https://jingyan.baidu.com/article/7f766daf7866be4101e1d0ed.html 只是设置共享文件夹选项还不行,需要从安装vmware的安装路径中找 ...
- 三:python 对象类型详解一:数字(上)
一:python 的数字类型: a)整数和浮点数 b)复数 c)固定精度的十进制数 d)有理分数 e)集合 f)布尔类型 g)无穷的整数精度 h)各种数字内置函数和模块 二:各种数字类型的详解 1,数 ...
- helm 更改为国内源
helm init --upgrade -i slpcat/tiller:v2.8.2 --stable-repo-url https://kubernetes.oss-cn-hangzhou.al ...