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的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...
随机推荐
- in_array 判断的一些见解
我个人见解in_array的判断是== 并不是=== 证明如下: $arr=(array_merge(range(1, 9),range('a', 'z'),range('A', 'Z')));$m ...
- hello world2
GTD就是Getting Things Done的缩写,翻译过来就是"把事情做完",GTD的核心理念概括就是必须记录下来要做的事,然后整理安排并使自己一一去执行.GTD的五个核心原 ...
- 身份证js检测
var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古&quo ...
- Hdu 3363 Ice-sugar Gourd(对称,圆)
Ice-sugar Gourd Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- SVN-Attempted to lock an already-locked dir错误
svn更新时,文件夹被锁死. 解决办法: 右键该文件,在team(版本管理)里面执行"清除"操作后,问题解决了.
- 获取星座的JS函数
通过JS获取星座的函数 function getConstellation(m,d){ var s="魔羯水瓶双鱼牡羊金牛双子巨蟹狮子处女天秤天蝎射手魔羯"; var arr=[2 ...
- 在ASP.NET Web Forms中使用页面导出伪xls Excel表格
将数据导出为Excel表格是比较常见的需求,也有很多组件支持导出真正的Excel表格.由于Excel能打开HTML文件,并支持其中的table元素以及p之类的文本元素的显示,所以把.html扩展名改为 ...
- excel_VB宏脚本_批量生成点餐宝接受的格式
Attribute VB_Name = "模块1" '作者:landv '开发时间:2015年12月28日18:09:34 '主要功能,为东风路小厨生成农行点餐宝所支持批量导入的格 ...
- JQuery select option append
三种方法: $('select').append($('<option>', {value:1, text:'One'})); $('select').append('<option ...
- php 基础篇 php 进阶篇
1:echo 12*3: 2 echo "Welcome" . " to imooc!";字符串连接. 3>foreach($shuzu as $key ...