时限:n.2000MS   内存限制:n.131072K
提交材料共计: 6600   接受: 2263   特别法官

描述

想象一下你站在一个二维迷宫里,由方形细胞组成,它们可能或可能不会充满岩石。你可以在一个台阶上移动北、南、东或西一个单元。这些动作叫做步行。
其中一个空单元包含一个盒子,它可以通过站在盒子旁边移动到相邻的自由单元格,然后移动到盒子的方向上。这样的举动叫做推。盒子不能用任何其他方式移动,而不是推,这意味着如果你把它推到角落里,你就再也无法把它从角落里弄出来了。

其中一个空单元被标记为目标单元格。你的工作就是通过一系列步行和推来把盒子带到目标细胞里。由于盒子很重,你想尽量减少推的次数。你能写一个程序来写出最好的这个序列吗?

输入

输入包含了几个迷宫的描述。每个迷宫描述都是从一个包含两个整数r和c(两个整数)开始的一行,表示迷宫的行数和列数。

下面是每个包含c字符的r行。每个字符描述迷宫的一个单元格。一个满是岩石的单元格由‘#’表示,一个空单元由‘.’表示。您的起始位置由“`S”、“方框的起始位置”和“`t”的目标单元构成。

输入以两个零终止r和c。

输出量

对于输入中的每个迷宫,首先打印迷宫的数目,如示例输出所示。然后,如果不可能将该框带到目标单元格,则打印“不可能”。

否则,输出一个最小化推数的序列。如果有不止一个这样的序列,选择最小化总移动数(行走和推)数的那个。如果仍然有不止一个这样的序列,任何一个都可以接受。

将序列作为字符串字符n、s、e、w、n、s、e和w等字符,大写字母表示推,小写字母表示行走,不同字母代表方向北、南、东、西。

在每个测试用例之后输出一个空行。

样本输入

1 7
SB....T
1 7
SB..#.T
7 11
###########
#T##......#
#.#.#..####
#....B....#
#.######..#
#.....S...#
###########
8 4
....
.##.
.#..
.#..
.#.B
.##S
....
###T
0 0

样本输出

Maze #1
EEEEE Maze #2
Impossible. Maze #3
eennwwWWWWeeeeeesswwwwwwwnNN Maze #4
swwwnnnnnneeesssSSS

来源

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 30
using namespace std;
string ans;
char map[MAXN][MAXN];
bool vis[MAXN][MAXN];
char dc[]={'W','E','N','S'};
char dc2[]={'w','e','n','s'};
int r,c,box_x,box_y,pson_x,pson_y;
int dir[][]={,-,,,-,,,};
struct node{ int x,y;string path; };
struct nond{ int px,py,bx,by;string path; };
bool check(int x,int y){ return map[x][y]!='#'; }
bool bfs2(int nx,int ny,int tx,int ty,int kx,int ky,string &pans){
queue<node>q;
memset(vis,,sizeof(vis));
vis[nx][ny]=vis[kx][ky]=true;
node now,tmp;
now.x=nx;now.y=ny;
now.path="";q.push(now);
while(!q.empty()){
now=q.front();q.pop();
if(now.x==tx&&now.y==ty){
pans=now.path;
return true;
}
for(int i=;i<;i++){
int zx=now.x+dir[i][];
int zy=now.y+dir[i][];
if(check(zx,zy)&&!vis[zx][zy]){
vis[zx][zy]=true;
tmp.x=zx;tmp.y=zy;
tmp.path=now.path+dc2[i];
q.push(tmp);
}
}
}
return false;
}
bool bfs(){
queue<nond>q;
memset(vis,,sizeof(vis));
vis[box_x][box_y]=true;
nond tmp,now;
now.px=pson_x;now.py=pson_y;
now.bx=box_x;now.by=box_y;
now.path="";q.push(now);
while(!q.empty()){
now=q.front();q.pop();
for(int i=;i<;i++){
int nx=now.bx+dir[i][];
int ny=now.by+dir[i][];
int tx=now.bx-dir[i][];
int ty=now.by-dir[i][];
string pans="";
if(check(nx,ny)&&check(tx,ty)&&!vis[nx][ny]){
if(bfs2(now.px,now.py,tx,ty,now.bx,now.by,pans)){
vis[nx][ny]=true;
tmp.px=now.bx;
tmp.py=now.by;
tmp.bx=nx;tmp.by=ny;
tmp.path=now.path+pans+dc[i];
if(map[nx][ny]=='T'){
ans=tmp.path;
return true;
}
q.push(tmp);
}
}
}
}
return false;
}
int main(){
int cs=;
while(scanf("%d %d",&r,&c)&&r!=&&c!=){
memset(map,'#',sizeof(map));
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
cin>>map[i][j];
if(map[i][j]=='B'){ box_x=i;box_y=j; }
if(map[i][j]=='S'){ pson_x=i;pson_y=j; }
}
}
printf("Maze #%d\n",cs++);
if(bfs()) cout<<ans<<endl;
else puts("Impossible.\n");
}
}

木有AC代码,不想调了。

POJ 1475 推箱的更多相关文章

  1. poj 1475 推箱子

    bfs是一层层的遍历下去,每多一层即为多走一步,因此只要遇到T就停,此时肯定是最小步数. 所以这两层bfs应为,先对箱子的最少步数进行bfs,从而求出推箱子所用最少步数: 然后箱子bfs内部嵌入人的b ...

  2. poj 1475 Pushing Boxes 推箱子(双bfs)

    题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...

  3. poj 1475 || zoj 249 Pushing Boxes

    http://poj.org/problem?id=1475 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=249 Pushin ...

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

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

  5. 【POJ 1475】 Pushing Boxes

    [题目链接] http://poj.org/problem?id=1475 [算法] 双重BFS [代码] #include <algorithm> #include <bitset ...

  6. poj 1475 uva 589 - Pushing Boxes

    题目大意 人推箱子从起点到终点,要求推箱子的次数最少,并打印出来人移动的路径. 题目分析 对于箱子进行宽搜的同时,要兼顾人是否能够把箱子推到相应的位置 每一次对箱子bfs 然后对人再bfs #incl ...

  7. (poj 1475) Pushing Boxes

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

  8. Pushing Boxes POJ - 1475 (嵌套bfs)

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

  9. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

随机推荐

  1. Spring Boot (33) 分布式锁

    上一篇中使用的Guava Cache,如果在集群中就不可以用了,需要借助Redis.Zookeeper之类的中间件实现分布式锁. 导入依赖 在pom.xml中需要添加的依赖包:stater-web.s ...

  2. Java虚拟机内存详解

    概述 Java虚拟机会自动管理内存,不容易出现内存泄漏和内存溢出问题.Java虚拟机会在执行过程中将管理的内存分为若干个不同的数据区域. 运行时数据区域 在jdk1.8之前的版本与1.8版本略有不同, ...

  3. WebApi实现IHttpControllerSelector问题

    一.让Web API路由配置也支持命名空间参数/// <summary>    /// controller     /// 选择器    /// </summary>    ...

  4. Queries for Number of Palindromes(求任意子列的回文数)

    H. Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabyt ...

  5. java byte

    项目中有段代码,一直让我疑惑不解,但我是个很会偷懒的人,只要拷贝来改改能用的代码,万万不会自己动手写,虽然一直有疑惑,也懒得搭理是怎么个原理. 直到今天,又要解析协议,又要动这个地方的代码,还是来盘他 ...

  6. 从输入URL到网页呈现的过程

    1.域名解析当我们在浏览器中输入一个URL,例如”www.google.com”时,这个地址并不是谷歌网站真正意义上的地址.互联网上每一台计算机的唯一标识是它的IP地址,因此我们输入的网址首先需要先解 ...

  7. CAD得到范围内实体(网页版)

    主要用到函数说明: IMxDrawSelectionSet::Select 构造选择集.详细说明如下: 参数 说明 [in] MCAD_McSelect Mode 构造选择集方式 [in] VARIA ...

  8. vue基础---列表渲染

    首先简单回顾下v-for‘指令 <ol id="list_area"> <li v-for="book in books">{{book ...

  9. 关于DEV-c++ 运行窗口闪退的解决办法

    因为程序默认运行结束自动关闭,所以运行窗口会被秒关,反复下载了很多遍也没有解决. 上网看过许多博客后,有好多方法,总结一下: ①在return 0:前加getchar():(getchar():是得到 ...

  10. [Algorithm] 10. Reverse Integer

    Description Given a 32-bit signed integer, reverse digits of an integer. Example Example 1: Input: 1 ...