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)的更多相关文章

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

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

  2. HDU 1254 推箱子(BFS)

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

  3. HDU 1254 推箱子 BFS

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

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

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

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

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

  6. hdu 1254 推箱子(嵌套搜索,bfs中有dfs)

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

  7. hdu 1254 推箱子(搜索)

    我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...

  8. [HDU 1254] 推箱子

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

  9. HDU 1254 推箱子游戏(搞了一下午。。。)

    中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...

随机推荐

  1. 如何在tomcat部署项目(用ip访问)

    找了好长时间的错误,server.xml中一点错误也没有,但就是访问不到,最终发现就是服务器没有开放80端口的缘故. 服务器是Windows系统 1.控制面板=>系统和安全=>Window ...

  2. Web前端深思

    WEB视图层技术从最初刀耕火种的时代到如今技术框架丛生,其中的感受只有经历过才知道.但到目前为止前端领域还只是整个IT行业比较边缘化的分支,因为目前的前端coder大多都还停留在视图层的处理上,利用前 ...

  3. 依赖注入(IOC) 详解

    https://blog.csdn.net/qq_27093465/article/details/52547290 https://blog.csdn.net/qq_27093465/article ...

  4. 学习笔记 第八章 使用CSS美化列表

    第8章  使用CSS美化列表 8.1 列表的基本结构 在HTML中,列表结构可以分为两种基本类型:有序列表和无序列表.使用标签如下: <ul>...</ul>:标识无序列表: ...

  5. js 和 java 将时间倒计时显示

    需求:用户购买产品,创建了一个订单,但是还么有支付,此时给用户三十分钟剩余支付时间,前台页面做倒计时功能,时间到达时,更改订单状态 ,输出的格式是:29:23 java 实现 package com. ...

  6. 掌握Spark机器学习库-08.2-朴素贝叶斯算法

    数据集 iris.data 数据集概览 代码 import org.apache.spark.SparkConf import org.apache.spark.ml.classification.{ ...

  7. asp IIS网站的配置(Win7下启用IIS7配置ASP运行环境)

    其实win7下的IIS7配置过程是非常简单的.下面让seo博客来详细的介绍一下win7下配置IIS7环境运行ASP网站的方法,以供初接触者参考   第一次在windows7下配置IIS,虽然有丰富的x ...

  8. 【译】x86程序员手册36-9.9异常汇总

    9.9 Exception Summary 异常汇总 Table 9-6 summarizes the exceptions recognized by the 386. Table 9-6. Exc ...

  9. 洛谷 P1615 西游记公司

    题目背景 一道极其无厘头的题目 题目描述 事情是这样的:西游记中的孙沙猪(孙杀猪)三徒弟在西天取经之后开始进入厦门大学经贸系学习经济,在1个小时的学习后,他们用暴力手段毕业了.然后,他们创办了三个公司 ...

  10. iisexpress局域网内调试网站

    1.找到IISExpress目录 IISExpress\config\applicationhost.config(注:如果使用vs2015则更改解决方案目录下的.vs文件夹中的该文件) <si ...