题目连接: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)的更多相关文章

  1. HDU 1254 推箱子(BFS)

    Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不 ...

  2. HDU1254 推箱子(BFS) 2016-07-24 14:24 86人阅读 评论(0) 收藏

    推箱子 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推 ...

  3. HDU 1254 推箱子(BFS加优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  4. suseoj 1212: 推箱子问题(bfs)

    1212: 推箱子问题 时间限制: 1 Sec  内存限制: 128 MB提交: 60  解决: 13[提交][状态][讨论版][命题人:liyuansong] 题目描述 码头仓库是划分为n×m个格子 ...

  5. AcWing:172. 立体推箱子(bfs)

    立体推箱子是一个风靡世界的小游戏. 游戏地图是一个N行M列的矩阵,每个位置可能是硬地(用”.”表示).易碎地面(用”E”表示).禁地(用”#”表示).起点(用”X”表示)或终点(用”O”表示). 你的 ...

  6. hdu.1254.推箱子(bfs + 优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  7. HDU 1254 推箱子 BFS

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目分析: 做这道题,感觉挺简单的,做着做着就错了20次, 我也是醉了, WA到吐的节奏啊! 思 ...

  8. 推箱子 (hdu1254)(bfs双重广搜)

    推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission ...

  9. hdu 1254 推箱子(双重bfs)

    题目链接 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能 ...

随机推荐

  1. 关于jQuery表单校验

    <style> .red{border: 1px solid red;} .wrong-tip{color: red;} </style> <form action=&q ...

  2. java.net.ConnectException connect refured

    原因:tomcat 连接拒绝:tomcat没有完全重启 只是部分重启 解决方案: 连接tomcat服务 命令:1:ps -ef|grep java : 2:kill -9 21060 3:查看tomc ...

  3. Oracle中sys和system用户的区别

    1.数据库的启动需要以SYSDBA/SYSOPER身份登录. 2.如果在同一主机上使用IPC连接到数据库使用操作系统授权,登录任何一个用户都可以拥有as sysdba和as sysoper. 3.sy ...

  4. Atitit 版本管理----分支管理

    Atitit 版本管理----分支管理 版本管理系统"(Version Control System Branch/tag在一个功能选项中,在使用中很容易产生混淆. 分支(Branch)管理 ...

  5. WebService第一天

    WebService第一天 [课程安排]: 整体安排:2天: 第一天:webservice入门,JDK规范和实现:jax-ws,相关概念 第二天:CXF框架,和spring的集成开发.Hessian的 ...

  6. 第八十六节,html5+css3pc端固定布局,网站结构,CSS选择器,完成导航

    html5+css3pc端固定布局,网站结构,CSS选择器,完成导航 页面采用1280的最低宽度设计,去掉滚动条为1263像素. 项目是PC端的固定布局,会采用像素(px)单位. 网站结构语义 在没有 ...

  7. 3、FileInputStream--->类文件输入流(读取文件数据)

    Api介绍 定义 FileInputStream 用于读取诸如图像数据之类的原始字节流.要读取字符流,请考虑使用 FileReader 构造方法 FileInputStream(File file) ...

  8. Sass与Compress实战:第一章

    1.消除冗余代码的方式: ▶通过变量来复用属性值 例如,一段冗余的CSS代码: h1#brand { color : #1875e7 } #sidebar { background-color : # ...

  9. POJ 2240 Arbitrage(SPFA+邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cmath> #include<algori ...

  10. 6、Spring+Struts2+MyBatis(mybatis有代理)整合增删改查

    1.创建如下的oracle脚本 create table userinfo (id ), name ), password telephone ), isadmin )); --4.2 用户表序列 c ...