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 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- 04_web基础(二)之web构建
03.04.05.06web项目创建 07.第一个Servlet程序 1.拷贝tomcat 中的 servlet-api.jar 在lib包下面 2.新建一个HelloWordServlet类并实现 ...
- Java的map键值对的用法,map的遍历,Entry对象的使用
思路: 1.定义集合 2.存储数据 3.添加元素 4.遍历 4.1将需要遍历的集合的键封装到set集合中(这用到了entrySet方法,和Entry对象) 4.2声明迭代器或者用for增强循环 4.3 ...
- lua keynote2
[lua keynote2] 1.Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil). > s, e = ...
- STL::forward_list
forward_list(c++11): 内部是一个单链表的实现:但是为了效率的考虑,故意没有 size 这个内置函数. Constructor 六种构造方式default; fill; range; ...
- rancher2 HA部署注意事项
参考: https://rancher.com/docs/rancher/v2.x/en/installation/ha-server-install/ https://www.cnblogs.com ...
- 一个范围的两个数进行数位的累加,实现对两个数num1和num2的数位和相加
对一个范围的两个数进行数位的累加,例如有两个数 15,19则 他们的数位和应该为: 1+5+1+6+1+7+1+8+1+9,结果为40. 测试说明 样例1 输入:1519 输出: 40 以下是不同方法 ...
- centos 6 KVM 网卡桥接配置
一. 网卡桥接前准备 1.软件支持: # rpm -qa bridge-utils # yum install bridge-utils 确保软件包已安装 2. 关闭NetworkMana ...
- CentOS 系统时间与硬件时间
date 系统时间查看 date -s 'YYYYMMDD HHMMSS' 设置系统时间 hwclock 硬件时间查看 hwclock -w 将系统时间同步到硬件时间 cp /usr/share/zo ...
- 修改django后台用户名和密码
cd到manage.py目录下 python manage.py shell >>from django.contrib.auth.models import User >>u ...
- swift - iOS10之后的加速器
import UIKit //1.加速器框架 import CoreMotion class ViewController: UIViewController { //1.创建运动管理者 必须设置为 ...