题目链接:http://poj.org/problem?id=1475

一组测试数据:

7 3

###

.T.

.S.

#B#

...

...

...

结果:

//解题思路:先判断盒子的四周是不是有空位,如果有,则判断人是否能到达盒子的那一边,能的话,把盒子推到空位处,然后继续

AC代码:

 //解题思路:先判断盒子的四周是不是有空位,如果有,则判断人是否能到达盒子的那一边,能的话,把盒子推到空位处,然后继续
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
int bx,by,sx,sy,tx,ty;
int m,n,dir[][]={-,,,,,-,,};//注意题目要求的是n、s、w、e的顺序,因为这个wa了一次
char op[]={'n','s','w','e'};
bool mark[][][];//标记箱子四周的位置时候已被用过
int vis[][];//标记人走过的位置
char map[][];
struct BB//盒子
{
int x,y,SX,SY;//SX,SY表示当前箱子固定了,人所在的位置
string ans;
}bnow,beed;
struct YY//人
{
int x,y;
string ans;
}ynow,yeed;
char up(char c)
{
return (c-'a'+'A');
}
//aa,bb 表示当前盒子的位置;ss,ee表示起点;
bool bfs2(int s,int e,int aa,int bb,int ss,int ee)//寻找当前人,是否能够到达盒子指定的位置;
{
queue<YY>yy;
if(s< || s>m || e< || e>n || map[s][e] == '#') return false;
ynow.x = ss; ynow.y = ee; ynow.ans="";
memset(vis,,sizeof(vis));
vis[aa][bb] =;//不能经过盒子
vis[ss][ee] = ;//起点标记为
yy.push(ynow);
while(!yy.empty())
{
ynow = yy.front();
yy.pop();
if(ynow.x == s && ynow.y == e)
{
return true;
}
for(int i=;i<;i++)
{
yeed.x = ynow.x+dir[i][];
yeed.y = ynow.y+dir[i][];
if(yeed.x> && yeed.x<=m && yeed.y> && yeed.y<=n && !vis[yeed.x][yeed.y] && map[yeed.x][yeed.y]!='#')
{
yeed.ans = ynow.ans+op[i];//记录走过的路径
vis[yeed.x][yeed.y] = ;
yy.push(yeed);
}
}
}
return false;
}
bool bfs1()
{
queue<BB>bb;
bnow.x = bx;bnow.y=by;bnow.ans="";
bnow.SX = sx;bnow.SY=sy;
bb.push(bnow);
while(!bb.empty())
{ bnow=bb.front();
bb.pop();
if(bnow.x == tx && bnow.y==ty)
{
return true;
}
for(int i=;i<;i++) //盒子周围的四个方向;
{
beed.x = bnow.x+dir[i][];
beed.y = bnow.y+dir[i][];
if(beed.x> && beed.x<=m && beed.y> && beed.y<=n && !mark[beed.x][beed.y][i] && map[beed.x][beed.y]!='#')
{
if(bfs2(beed.x-*dir[i][],beed.y-*dir[i][],bnow.x,bnow.y,bnow.SX,bnow.SY))//如果能推到yeed,则需要判断人是否能到达,它的上一个点;
{
beed.SX = bnow.x;//推完箱子后,人的位置在箱子上
beed.SY = bnow.y;
beed.ans=bnow.ans+ynow.ans+up(op[i]);//当前的加上推箱子的加上目前挨着推的;
mark[beed.x][beed.y][i] = true;
bb.push(beed);
}
}
}
}
return false;
}
int main()
{
int T,k=;
while(scanf("%d %d",&m,&n) && m+n)
{
memset(mark,false,sizeof(mark));
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
{
scanf(" %c",&map[i][j]);
if(map[i][j] == 'S')
{
sx=i;sy =j;
}
if(map[i][j] == 'T')
{
tx = i;ty = j;
}
if(map[i][j] == 'B')
{
bx = i;by = j;
}
}
printf("Maze #%d\n",k++);
if(bfs1()) printf("%s\n\n",bnow.ans.c_str());//少个换行wa了一次
else printf("Impossible.\n\n");
}
return ;
}

poj 1475 Pushing Boxes 推箱子(双bfs)的更多相关文章

  1. POJ 1475 Pushing Boxes 搜索- 两重BFS

    题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...

  2. (poj 1475) Pushing Boxes

    Imagine you are standing inside a two-dimensional maze composed of square cells which may or may not ...

  3. [poj P1475] Pushing Boxes

    [poj P1475] Pushing Boxes Time Limit: 2000MS   Memory Limit: 131072K   Special Judge Description Ima ...

  4. HDU 1475 Pushing Boxes

    Pushing Boxes Time Limit: 2000ms Memory Limit: 131072KB This problem will be judged on PKU. Original ...

  5. HDU 1254 推箱子(BFS)

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

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

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

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

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

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

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

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

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

随机推荐

  1. 以下内容为Stackoverflow上整理以作纪录

    PRO 用IMG标签 Use IMG plus alt attribute if the image is part of the content such as a logo or diagram ...

  2. openresty记录响应body乱码问题

    问题背景 最近新上了一个功能,openresty通过syslog记录请求日志,然后由logstash推送至ES.测试上线时未发现这个问题,在日常查看日志的过程中,发现logstash推送有错误日志,错 ...

  3. nano命令,vi ed pico sed joe emacs jed ex

    nano命令   nano是一个字符终端的文本编辑器,有点像DOS下的editor程序.它比vi/vim要简单得多,比较适合Linux初学者使用.某些Linux发行版的默认编辑器就是nano. nan ...

  4. 剖析ASP.NET Core(Part 4)- 调用MVC中间件(译)

    原文:https://www.stevejgordon.co.uk/invoking-mvc-middleware-asp-net-core-anatomy-part-4 发布于:2017年5月环境: ...

  5. android 启动socket 失败:socket(af_inet sock_stream 0) 返回-1

    Android 启动socket 失败:socket(af_inet sock_stream 0) 返回-1 原因权限问题, 应该添加如下权限: <uses-permission android ...

  6. scala 2.11报错error: not found: type Application

    FROM: http://j-q-j.org/scala/scala-2-11-application-error.html 这两天学习scala,官网下载的最新版本2.11,书用的是<Prog ...

  7. spfile 和用户环境变量 和export

    RAC数据库环境变量设置 [oracle@rac1 ~]$ sqlplus / as sysdba  SQL*Plus: Release 10.2.0.1.0 - Production on Fri ...

  8. 如何访问python类中的私有方法

    在python中,不像c#/java类语言,支持类的私有方法,这点有点像objc,虽然objc可以通过扩展extension来实现,但源于objc的运行时特性,我们还是可以通过非常手段来进行访问的.不 ...

  9. Groovy(java)+Spock+IDEA+maven+Jenkins+SVN+maven-surefire-plugin+maven-surefire-report-plugin/maven-antrun-extended-plugin集成接口测试框架

    文章为原创,未经本人授权禁止转载. 一.spock框架环境搭建. 二.基于spock框架的脚本开发. 三.基于spock框架的用例执行并生成HTML报告. 四.集成jenkins生成HTML报告. 五 ...

  10. 求x>0时,y=x^3-6x^2+15的极值

    解: 当x→∞时,y也→∞,所以y没有最大值. y=x3-6x2+15=-4*(x/2)*(x/2)*(6-x)+15 而根据几何平均数小于等于算术平均数的定理,(x/2)*(x/2)*(6-x)在x ...