题目连接: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. hadoop集群免密码登陆

    今天用openstack的dashboard创建了5个instance,现在的工作就是让它们可以相互访问. 1个namenode,4个datanode. 总体思路:有namenode产生公钥和密钥,传 ...

  2. git的使用,将本地项目push到github上

    Git教程(推荐): http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000git是先用a ...

  3. Beef

    修改配置文件/usr/share/beef-xss/config.yaml (1)改vi beef侦听端口:    http:   port:3000(改为80) (2)与Metaspolit关联: ...

  4. [妙味JS基础]第十二课:数组随机、数组去重

    知识点总结 json var json={'name':'abc'} 属性加分号为安全的写法 json: 只能用for in 数组:for和for in 都可以使用 json没有length和下标 数 ...

  5. iOS二维码条形码的制作

    - (IBAction)creatQRImage:(id)sender { [self.textField resignFirstResponder]; //这里是我放了个TextField的控件,但 ...

  6. Python 常见错误

    1. def func(): return a=3#错误的用法 2. class a: def func():#func至少要有一个self参数 ........................... ...

  7. Docker安装目录

    操作系统为 # cat /etc/redhat-release CentOS Linux release (Core) docker安装 # yum install -y docker docker安 ...

  8. ubuntu安装docker

    uname -r #查看内核版本要大于3.10apt-get updateapt-get install linux-image-generic-lts-trusty wget -qO- https: ...

  9. ASP.NET MVC 实现AJAX跨域请求的两种方法

    通常发送AJAX请求都是在本域内完成的,也就是向本域内的某个URL发送请求,完成部分页面的刷新.但有的时候需要向其它域发送AJAX请求,完成数据的加载,例如Google. 在ASP.NET MVC 框 ...

  10. Excel教程(6) - 外部函数

    EUROCONVERT 用途:将数字转换为欧元形式,将数字由欧元形式转换为 欧盟成员国货币形式,或利用欧元作为中间货币将数字由某一 欧盟成员国货币转化为另一欧盟成员国货币的形式(三角转换 关系). 语 ...