hdu_1254_推箱子(双BFS)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1254
题解:以箱子为主体,第一层BFS,然后用第二层BFS来判断人是否可以到达,这里细节比较多,要注意
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define FFC(i,a,b) for(int i=a;i<=b;i++)
struct dtm{int x,y,t;};
struct dtb{int x,y,t,mx,my;};
int g[][],gg[][],t,m,n,x1,y1,x2,y2,d[][]={,,-,,,,,-};
bool v[][][],f[][];
bool checkmen(int x,int y){
if(f[x][y]||x<||x>n||y<||y>m||gg[x][y]!=)return ;
return ;
}
bool checkbox(int x,int y,int i){
if(v[x][y][i]||x<||x>n||y<||y>m||g[x][y]==)return ;
return ;
}
int bfs(int sx,int sy,int ex,int ey){
if(ex<||ex>n||ey<||ey>m)return -;
memset(f,,sizeof(f));
dtm s,o;s.x=sx,s.y=sy,s.t=,f[sx][sy]=;
queue<dtm>Q;Q.push(s);
while(!Q.empty()){
o=Q.front();Q.pop();
if(o.x==ex&&o.y==ey)return o.t;
for(int i=;i<;i++){
int xx=o.x+d[i][],yy=o.y+d[i][];
if(!checkmen(xx,yy))continue;
s.x=xx,s.y=yy,s.t=t+,f[xx][yy]=;
Q.push(s);
}
}
return -;
}
int fuck(){
memset(v,,sizeof(v));
dtb s,o;s.x=x1,s.y=y1,s.mx=x2,s.my=y2,s.t=;
queue<dtb>Q;Q.push(s);
while(!Q.empty()){
o=Q.front();Q.pop();
if(g[o.x][o.y]==)return o.t;
for(int i=;i<;i++){
int xx=o.x+d[i][],yy=o.y+d[i][],ok;
if(!checkbox(xx,yy,i))continue;
gg[o.x][o.y]=;
ok=bfs(o.mx,o.my,o.x-d[i][],o.y-d[i][]),gg[o.x][o.y]=;
if(ok==-)continue;
s.x=xx,s.y=yy,s.mx=o.x,s.my=o.y,s.t=o.t+,v[xx][yy][i]=;
Q.push(s);
}
}
return -;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
FFC(i,,n)FFC(j,,m){
scanf("%d",&g[i][j]);
gg[i][j]=(g[i][j]==?:);
if(g[i][j]==)x1=i,y1=j;
if(g[i][j]==)x2=i,y2=j;
}
printf("%d\n",fuck());
}
return ;
}
hdu_1254_推箱子(双BFS)的更多相关文章
- HDU 1254 推箱子(BFS)
Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...
- HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏
推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...
- HDU 1254 推箱子(BFS加优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others) Me ...
- suseoj 1212: 推箱子问题(bfs)
1212: 推箱子问题 时间限制: 1 Sec 内存限制: 128 MB提交: 60 解决: 13[提交][状态][讨论版][命题人:liyuansong] 题目描述 码头仓库是划分为n×m个格子 ...
- AcWing:172. 立体推箱子(bfs)
立体推箱子是一个风靡世界的小游戏. 游戏地图是一个N行M列的矩阵,每个位置可能是硬地(用”.”表示).易碎地面(用”E”表示).禁地(用”#”表示).起点(用”X”表示)或终点(用”O”表示). 你的 ...
- hdu.1254.推箱子(bfs + 优先队列)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 1254 推箱子 BFS
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...
- 推箱子 (hdu1254)(bfs双重广搜)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...
- hdu 1254 推箱子(双重bfs)
题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
随机推荐
- rsync 断点续传
# rsync -avzP file root@172.20.7.219:/root/tmp (我这里file指要传送的文件)
- redis12--常用API
上一篇总结我们使用我们本地的Eclipse中创建的jedis工程,链接到了我们处于VMware虚拟机上的Linux系统上的Redis服务,我们接下来讲一下jedis的一些常用的API.(1)jedis ...
- Express ( MiddleWare/中间件 路由 在 Express 中使用模板引擎 常用API
A fast, un-opinionated, minimalist web framework for Node.js applications. In general, prefer simply ...
- NIC Bonding: 2 nic port as 1 interface
The following is concluded from here. Consider we have 2 interfaces: eth0 & eth1 bond the two in ...
- hadoop 完全分布式
转自:http://blog.itpub.net/26613085/viewspace-1219710/ 1.JDK安装和SSH互信(略过) 2.各节点IP和hostname如下(各节点需配置) [h ...
- VPS服务器利用WINSCP软件进行SFTP管理服务器文件
虽然我使用VPS时间也不是很久,但是我善于进行统计和分析,从我在的一些VPS交流QQ群中,可以看到基本上使用搬瓦工VPS的站长群中新手较多,甚至很多人都搞不明白VPS与V-P-N的区别都直接选择VPS ...
- 查询被收录页面中的死链接 By SEO
朋友说他的站挂了,想知道被收录的页面有多少是死链,于是我就想了一下流程,从Site获得收录数量当然是不精准的,不过也没有更好的地了,真实的收录只有搜索引擎数据库里面才有... 查询被收录页面的状态码, ...
- 【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析
代码里面发送粘性事件代码如下: // 发送Sticky事件 EventBus.getDefault().postSticky(new User("soyoungboy", &quo ...
- CodeForces 700A As Fast As Possible
要保证总时间最短,因为总时间计的是最后一个人到达的时间,也就是最后一个人要求尽快到达,也就是说我们要让最后一个人乘车时间尽量多.再仔细想想可以发现每个人的乘车时间和走路时间都是一样的. 因此,可以二分 ...
- iOS开发The Operation couldn't be completed.(LaunchServicesError error 0.)的解决方法
显示错误:The Operation couldn't be completed.(LaunchServicesError error 0.)解决办法:第1种方法.点击当前的模拟器,点击IOS Sim ...