hdu - 1254 推箱子 (bfs+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1254
题目意思很简单,只要思路对就好。
首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工需要到达的目的地,用另一个bfs判断,然后就类似两个点的bfs那样用一个数组标记状态,
需要注意箱子在边上的情况。
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; struct point
{
int x,y,nx,ny,step;
}; int n,m;
int maze[][];
int used[][][][];
int dir[][]={{-,},{,},{,-},{,}}; bool bfs1(int a,int b,int c,int d,int p,int q)
{
int mark[][];
memset(mark,,sizeof(mark));
queue<point>que;
point s;
s.x=a,s.y=b;
mark[s.x][s.y]=;
que.push(s);
while(!que.empty())
{
point e=que.front();que.pop();
//printf("%d %d\n",e.x,e.y);
if(e.x==c&&e.y==d) return true;
for(int i=;i<;i++)
{
s.x=e.x+dir[i][];
s.y=e.y+dir[i][];
if(s.x==p&&s.y==q) continue;
//printf("%d %d\n",s.x,s.y);
if(s.x>=&&s.x<n&&s.y>=&&s.y<m&&maze[s.x][s.y]!=&&!mark[s.x][s.y])
{
mark[s.x][s.y]=;
que.push(s);
}
}
}
return false;
} void bfs2(int a,int b,int c,int d)
{
memset(used,,sizeof(used));
queue<point>que;
point s,e;
s.x=a,s.y=b,s.nx=c,s.ny=d,s.step=;
que.push(s);
used[s.x][s.y][s.nx][s.ny]=;
while(!que.empty())
{
e=que.front();que.pop();
//printf("%d %d %d %d %d\n",e.x,e.y,e.nx,e.ny,e.step);
if(maze[e.x][e.y]==) {printf("%d\n",e.step);return;}
for(int i=;i<;i++)
{
s.x=e.x+dir[i][];
s.y=e.y+dir[i][];
s.nx=e.x;
s.ny=e.y;
if(s.x<||s.x>=n||s.y<||s.y>=m||maze[s.x][s.y]==||used[s.x][s.y][s.nx][s.ny]) continue;
if(i==)
{
if(e.x+>=n||maze[e.x+][e.y]==||(bfs1(e.nx,e.ny,e.x+,e.y,e.x,e.y)==false)) continue;
}
else if(i==)
{
if(e.x-<||maze[e.x-][e.y]==||(bfs1(e.nx,e.ny,e.x-,e.y,e.x,e.y)==false)) continue;
}
else if(i==)
{
if(e.y+>=m||maze[e.x][e.y+]==||(bfs1(e.nx,e.ny,e.x,e.y+,e.x,e.y)==false)) continue;
}
else if(i==)
{
if(e.y-<||maze[e.x][e.y-]==||bfs1(e.nx,e.ny,e.x,e.y-,e.x,e.y)==false) continue;
}
used[s.x][s.y][s.nx][s.ny]=;
s.step=e.step+;
que.push(s);
}
}
printf("-1\n");
} int main()
{
//freopen("a.txt","r",stdin);
int t,a,b,c,d;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
scanf("%d",&maze[i][j]);
if(maze[i][j]==)
{
a=i;
b=j;
}
else if(maze[i][j]==)
{
c=i;
d=j;
}
}
bfs2(a,b,c,d);
}
return ;
}
hdu - 1254 推箱子 (bfs+bfs)的更多相关文章
- HDU 1254 推箱子(BFS加优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- HDU 1254 推箱子 BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
- 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中有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 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...
- [HDU 1254] 推箱子
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子游戏(搞了一下午。。。)
中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
随机推荐
- 里氏替换原则中is和as分别的作用
is 是用于检查对象是否指定类型兼容 if(empls[i] is SE){ ((SE)empls).SayHi(); } as 不用强转可以直接转换 if(empls[i] is SE){ SE s ...
- .vue文件在phpstorm中红线解决办法
主要原因是js版本太低, 1,安装vue.js插件, 2,设置file type,vue.js添加 *.vue, 3,切换js版本为es6,
- 微信小程序开发初次尝试-----实验应用制作(一)
初次尝试微信小程序开发,在此写下步骤以做记录和分享. 1.在网上找了很多资料,发现这位知乎大神提供的资料非常全面. 链接 https://www.zhihu.com/question/50907897 ...
- EditText自动弹出软键盘
editText.requestFocus() editText.isFocusable = true editText.isFocusableInTouchMode = true val timer ...
- oracle 安装,启动 ,plsql 连接
1.下载oracle 服务器端,正常安装,在选择桌面类或者是服务器类的时候选择服务器类. 2.下载oracle 客户端解压版 下载地址 链接:https://pan.baidu.com/s/1mi ...
- asterisk-java ami4 一些基本功能的例子
比如:挂机,拨号,拨外线,保留通话,示闲,示忙等等.... 在api中可以获得这些方法说明 /** * 给分机挂机 * @param Extension 要挂机的分机号 * @return * ...
- LOL喷子专用自动骂人工具,2018更新完整版!
软件截图 软件说明: 先进入游戏 打开程序 Z开启/C关闭 下载地址:密码 yjnm
- PHP流程控制考察点
php遍历数组的三种方法及各自的区别 php遍历数组的方式主要有三种: for循环 foreach循环 while.list().each()组合循环 其中: for循环只能遍历索引数组,foreac ...
- Android(java)学习笔记197:ContentProvider使用之内容观察者02
下面通过3个应用程序之间的交互说明一下内容观察者: 一. 如下3个应用程序为相互交互的: 二.交互逻辑图: 三.具体代码: 1. 16_数据库工程: (1)数据库帮助类BankDBOpenHelp ...
- CAD参数绘制实心圆弧填充(com接口)
C#中实现代码说明: private void DrawPathToHatch1() { //把路径的开始位置移动指定的点 //参数一为点的X坐标 ,参数二为点的Y坐标,参数三为该点处开始宽度,对Po ...