Description

Imagine you are standing inside a two-dimensional maze composed of square cells which may or may not be filled with rock. You can move north, south, east or west one cell at a step. These moves are called walks. 

One of the empty cells contains a box which can be moved to an adjacent free cell by standing next to the box and then moving in the direction of the box. Such a move is called a push. The box cannot be moved in any other way than by pushing, which means that
if you push it into a corner you can never get it out of the corner again. 



One of the empty cells is marked as the target cell. Your job is to bring the box to the target cell by a sequence of walks and pushes. As the box is very heavy, you would like to minimize the number of pushes. Can you write a program that will work out the
best such sequence? 

Input

The input contains the descriptions of several mazes. Each maze description starts with a line containing two integers r and c (both <= 20) representing the number of rows and columns of the maze. 



Following this are r lines each containing c characters. Each character describes one cell of the maze. A cell full of rock is indicated by a `#' and an empty cell is represented by a `.'. Your starting position is symbolized by `S', the starting position of
the box by `B' and the target cell by `T'. 



Input is terminated by two zeroes for r and c. 

Output

For each maze in the input, first print the number of the maze, as shown in the sample output. Then, if it is impossible to bring the box to the target cell, print ``Impossible.''. 



Otherwise, output a sequence that minimizes the number of pushes. If there is more than one such sequence, choose the one that minimizes the number of total moves (walks and pushes). If there is still more than one such sequence, any one is acceptable. 



Print the sequence as a string of the characters N, S, E, W, n, s, e and w where uppercase letters stand for pushes, lowercase letters stand for walks and the different letters stand for the directions north, south, east and west. 



Output a single blank line after each test case. 

Sample Input

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

Sample Output

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

思路:用一个四维数组分别记录箱子和人的位置。son数组记录上一个节点,用优先队列让推的次数最小的先出队。递归输出路径。

#include <cstdio>
#include <queue>
using namespace std; struct S{
int x,y,bx,by,id,pcnt,acnt;
friend bool operator<(struct S a,struct S b);
}t; bool operator<(struct S a,struct S b)
{
if(a.pcnt!=b.pcnt) return a.pcnt>b.pcnt;
else return a.acnt>b.acnt;
} priority_queue<struct S>que; char mp[20][21];
bool vis[20][20][20][20];
int nxt[4][2]={{0,1},{1,0},{0,-1},{-1,0}},val[1000000],son[1000000],idx; void dfs(int x)
{
if(son[x]!=-1)
{
dfs(son[x]);
printf("%c",val[x]);
}
} int main()
{
int n,m,i,j,p,q,ex,ey,casenum=1; while(~scanf("%d%d",&n,&m) && n)
{
printf("Maze #%d\n",casenum++); for(i=0;i<n;i++) scanf("%s",mp[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) for(p=0;p<n;p++) for(q=0;q<m;q++) vis[i][j][p][q]=0; for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mp[i][j]=='S') mp[i][j]='.',t.x=i,t.y=j;
if(mp[i][j]=='B') mp[i][j]='.',t.bx=i,t.by=j;
if(mp[i][j]=='T') mp[i][j]='.',ex=i,ey=j;
}
} vis[t.x][t.y][t.bx][t.by]=1; idx=1; t.id=0;
son[0]=-1;
t.pcnt=0;
t.acnt=0; while(!que.empty()) que.pop(); que.push(t); while(!que.empty())
{
t=que.top(); if(t.bx==ex && t.by==ey)
{
dfs(t.id);
printf("\n"); break;
} for(i=0;i<4;i++)
{
t.x+=nxt[i][0];
t.y+=nxt[i][1]; if(t.x>=0 && t.x<n && t.y>=0 && t.y<m && mp[t.x][t.y]=='.')
{
if(t.x==t.bx && t.y==t.by)//推箱子
{
t.bx+=nxt[i][0];
t.by+=nxt[i][1]; if(t.bx>=0 && t.bx<n && t.by>=0 && t.by<m && mp[t.bx][t.by]=='.')
{
if(!vis[t.x][t.y][t.bx][t.by])
{
vis[t.x][t.y][t.bx][t.by]=1; int oldid=t.id; son[idx]=t.id;
t.id=idx;
t.pcnt++;
t.acnt++; if(i==0) val[idx]='E';
if(i==1) val[idx]='S';
if(i==2) val[idx]='W';
if(i==3) val[idx]='N'; que.push(t); t.pcnt--;
t.acnt--;
idx++; t.id=oldid;
}
} t.bx-=nxt[i][0];
t.by-=nxt[i][1];
}
else//不推箱子
{
if(!vis[t.x][t.y][t.bx][t.by])
{
vis[t.x][t.y][t.bx][t.by]=1; int oldid=t.id; son[idx]=t.id;
t.id=idx;
t.acnt++; if(i==0) val[idx]='e';
if(i==1) val[idx]='s';
if(i==2) val[idx]='w';
if(i==3) val[idx]='n'; que.push(t); t.acnt--;
idx++; t.id=oldid;
}
}
} t.x-=nxt[i][0];
t.y-=nxt[i][1];
} que.pop();
} if(que.empty()) printf("Impossible.\n"); printf("\n");
}
}

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 推箱子(双bfs)

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

  3. (poj 1475) Pushing Boxes

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

  4. [poj P1475] Pushing Boxes

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

  5. HDU 1475 Pushing Boxes

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

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

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

  7. POJ1475 Pushing Boxes(BFS套BFS)

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

  8. poj 1475 || zoj 249 Pushing Boxes

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

  9. 『Pushing Boxes 双重bfs』

    Pushing Boxes Description Imagine you are standing inside a two-dimensional maze composed of square ...

  10. Pushing Boxes(广度优先搜索)

    题目传送门 首先说明我这个代码和lyd的有点不同:可能更加复杂 既然要求以箱子步数为第一关键字,人的步数为第二关键字,那么我们可以想先找到箱子的最短路径.但单单找到箱子的最短路肯定不行啊,因为有时候不 ...

随机推荐

  1. Linux下使用RecordMyDesktop进行屏幕录像

    近期我们在评估给用户提供视频教程的可能性,以此来展示某些用视频才能更好表达的教程.在挖掘这个问题的时候,我们发现极丰富的可用于屏幕录像的工具.这些程序大体上特性的区别有:视频质量,性能,兼容性.这在此 ...

  2. RabbitMq基本使用

    1.新建一个vhost : rabbitmqctl add_vhost test 2.新建一个用户: rabbitmqctl add_user news news 3.对这个news用户增加test ...

  3. Linux启动ftp服务器530 Permission denied解决方法(已试,行)

    Linux启动ftp服务器530 Permission denied解决方法重新在虚拟机下安装了linux.现在我想启动linux自带的ftp服务器:#service  vsftpd  start . ...

  4. windows server 2012 r2 iis8.5 部署asp.net mvc4/5程序小结

    windows server 2012 r2 iis8.5 部署asp.net mvc4/5程序小结 原文链接:http://www.xuanhun521.com/Blog/66d491f8-b479 ...

  5. Server Develop (六) Linux epoll总结

    Linux  epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select.epoll最大的好处在于它不会随着监听fd数目的增长而降低效率.因为在内核中的sele ...

  6. C++ 标准IO库

    <C++ Primer 4th>读书笔记 C++ 的输入/输出(input/output)由标准库提供.标准库定义了一族类型,支持对文件和控制窗口等设备的读写(IO).还定义了其他一些类型 ...

  7. EditPlus不能着色显示SQl语句的问题

    说明:今天重装了系统后,从网上安装下载了一个EditPlus阅读代码,发现sql语句是灰色的,不和以前的带有颜色的看着美观了,顿时心里别扭了起来.以为下错了版本,可是换了好几个,都是这样,网上查了一下 ...

  8. 15个专业版响应式WordPress主题

    当你准备创建一个新的网站,你会发现有很多的WordPress主题供你选择,它们强大而且合适.虽然大量的第三方插件可以解决脚本的问题,但这次我们要向你介绍一些完全不同于以往的主题,它们都是专业开发者开发 ...

  9. paip.mysql fulltext 全文搜索.最佳实践.

    paip.mysql fulltext 全文搜索.最佳实践.  作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blo ...

  10. paip.点击每个网页链接都提示下载的解决。

    paip.点击每个网页链接都提示下载的解决.   作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn. ...