时限: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. 计算科学(转自wiki)

    计算科学(也称科学计算 scientific computation 或 SC)是一个快速增长的多学科领域,使用先进的计算能力来理解和解决复杂的问题. 计算科学包括三个不同的方面: 1. 开发用于解决 ...

  2. 编写UI自动化测试用例原则

    1.一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器.2.一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统3.尽量只做功能中正向逻辑的验证,不要考虑 ...

  3. log4j建立propertie后要建立log4j2.xml

    log4j.properties ### \u8BBE\u7F6E### log4j.rootLogger = debug,stdout,D,E ### \u8F93\u51FA\u4FE1\u606 ...

  4. hdu5122 K.Bro Sorting

    思路: 模拟. 实现: #include <iostream> #include <cstdio> using namespace std; ], n, t; int main ...

  5. 人人都能读懂的css3 3d小demo

    css3 3d案例总结 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家.就把最近做的比较好的给大家分享下 1.旋转拼图 首先看下效果 代码主要由HTML和CSS3组成,应该说还是比较简 ...

  6. Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载

    元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...

  7. html5 页面音频

    1. html5 样式 <audio class="audioleft download" id="audVoice" type="audio/ ...

  8. Farseer.net轻量级开源框架 中级篇:动态数据库访问

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件 下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 ...

  9. 国外一些好用的UX/UI设计工具和资源介绍

    你今天使用的设计工具也许不再适合以后的网页和APP设计项目了.新的工具不断的推出市场,目标只有一个,让你的工作更快.更容易而且工作成效更好.以下就是各种工具的介绍入口,当您点击标题就会看到各种很好的工 ...

  10. 数据分片存储,mycat服务器

    关闭防火墙和selinux,配置yum源配置21 .22 数据库(这里以21为例)[root@host21 ~]# tar -xf mysql-5.7.17.tar[root@host21 ~]# y ...