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

描述

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

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

输入

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

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

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

输出量

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

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

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

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

样本输入

  1. 1 7
  2. SB....T
  3. 1 7
  4. SB..#.T
  5. 7 11
  6. ###########
  7. #T##......#
  8. #.#.#..####
  9. #....B....#
  10. #.######..#
  11. #.....S...#
  12. ###########
  13. 8 4
  14. ....
  15. .##.
  16. .#..
  17. .#..
  18. .#.B
  19. .##S
  20. ....
  21. ###T
  22. 0 0

样本输出

  1. Maze #1
  2. EEEEE
  3.  
  4. Maze #2
  5. Impossible.
  6.  
  7. Maze #3
  8. eennwwWWWWeeeeeesswwwwwwwnNN
  9.  
  10. Maze #4
  11. swwwnnnnnneeesssSSS

来源

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define MAXN 30
  7. using namespace std;
  8. string ans;
  9. char map[MAXN][MAXN];
  10. bool vis[MAXN][MAXN];
  11. char dc[]={'W','E','N','S'};
  12. char dc2[]={'w','e','n','s'};
  13. int r,c,box_x,box_y,pson_x,pson_y;
  14. int dir[][]={,-,,,-,,,};
  15. struct node{ int x,y;string path; };
  16. struct nond{ int px,py,bx,by;string path; };
  17. bool check(int x,int y){ return map[x][y]!='#'; }
  18. bool bfs2(int nx,int ny,int tx,int ty,int kx,int ky,string &pans){
  19. queue<node>q;
  20. memset(vis,,sizeof(vis));
  21. vis[nx][ny]=vis[kx][ky]=true;
  22. node now,tmp;
  23. now.x=nx;now.y=ny;
  24. now.path="";q.push(now);
  25. while(!q.empty()){
  26. now=q.front();q.pop();
  27. if(now.x==tx&&now.y==ty){
  28. pans=now.path;
  29. return true;
  30. }
  31. for(int i=;i<;i++){
  32. int zx=now.x+dir[i][];
  33. int zy=now.y+dir[i][];
  34. if(check(zx,zy)&&!vis[zx][zy]){
  35. vis[zx][zy]=true;
  36. tmp.x=zx;tmp.y=zy;
  37. tmp.path=now.path+dc2[i];
  38. q.push(tmp);
  39. }
  40. }
  41. }
  42. return false;
  43. }
  44. bool bfs(){
  45. queue<nond>q;
  46. memset(vis,,sizeof(vis));
  47. vis[box_x][box_y]=true;
  48. nond tmp,now;
  49. now.px=pson_x;now.py=pson_y;
  50. now.bx=box_x;now.by=box_y;
  51. now.path="";q.push(now);
  52. while(!q.empty()){
  53. now=q.front();q.pop();
  54. for(int i=;i<;i++){
  55. int nx=now.bx+dir[i][];
  56. int ny=now.by+dir[i][];
  57. int tx=now.bx-dir[i][];
  58. int ty=now.by-dir[i][];
  59. string pans="";
  60. if(check(nx,ny)&&check(tx,ty)&&!vis[nx][ny]){
  61. if(bfs2(now.px,now.py,tx,ty,now.bx,now.by,pans)){
  62. vis[nx][ny]=true;
  63. tmp.px=now.bx;
  64. tmp.py=now.by;
  65. tmp.bx=nx;tmp.by=ny;
  66. tmp.path=now.path+pans+dc[i];
  67. if(map[nx][ny]=='T'){
  68. ans=tmp.path;
  69. return true;
  70. }
  71. q.push(tmp);
  72. }
  73. }
  74. }
  75. }
  76. return false;
  77. }
  78. int main(){
  79. int cs=;
  80. while(scanf("%d %d",&r,&c)&&r!=&&c!=){
  81. memset(map,'#',sizeof(map));
  82. for(int i=;i<=r;i++){
  83. for(int j=;j<=c;j++){
  84. cin>>map[i][j];
  85. if(map[i][j]=='B'){ box_x=i;box_y=j; }
  86. if(map[i][j]=='S'){ pson_x=i;pson_y=j; }
  87. }
  88. }
  89. printf("Maze #%d\n",cs++);
  90. if(bfs()) cout<<ans<<endl;
  91. else puts("Impossible.\n");
  92. }
  93. }

木有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. Linux下安装网络软件的步骤

    Linux下安装网络软件的步骤(给linux初学者,linux大神请绕路) 首先下载你所需要的软件带有deb后缀的文件 然后切换到该文件的目录 切换到超级用户权限或者是(sudo) 使用sudo dp ...

  2. 解决:阿里云ECS上启动tomcat后,第一次访问时间特别长

    Re在ECS上启动tomcat后,第一次访问时间特别长      2017-04-25 10:16:04 INFO com.world.socket.ServerSocketListener  25- ...

  3. 查询编辑器便捷特性【MSSQL】

    SQL Server团队为用户提供了一个便捷的特性 如果没有突出显示文本,那么按F5,执行整个批处理. 如果突出显示文本(选中SQL命令),那么只执行选中文本.

  4. 使用antlr4及java实现snl语言的解释器

    对于antlr4的基础使用,请参考我的前一篇文章<用antlr4来实现<按编译原理的思路设计的一个计算器>中的计算器>. 其实我对于antlr4的理解也仅限于那篇文章的范围,但 ...

  5. mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  6. IOS7 状态栏和 Navigation Bar重叠的问题解决

    一 Status bar重叠问题: 方法一:隐藏Status bar   在plist里面增加2个变量  Status bar is initially hidden  -> YES   Vie ...

  7. CAD控件:COM接口实现自定义实体

    1. 实现步骤: 3 1. 实现步骤: 参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1) 增加自定义实体对象 调用DrawCustomEntity函数, ...

  8. oracle 内连接 左外连接 右外连接的用法,(+)符号用法

    1. 内连接很简单 select A.*, B.* from A,B where A.id = B.id select A.*, B.* from A inner join B on A.id = B ...

  9. 关于ajax跨域解读

    首先要了解何为跨域,(协议.域名.端口任意一个不同)的web资源.如何解决跨域:1,jsonp 它只支持GET请求而不支持POST等其它类型的HTTP请求:例如angular 中,如下使用,$http ...

  10. 剑指offer---最小的K个数

    题目:最小的K个数 要求:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. class Solution { public: ...