POJ 1475 推箱
时限:n.2000MS | 内存限制:n.131072K | |||
提交材料共计: 6600 | 接受: 2263 | 特别法官 |
描述
其中一个空单元包含一个盒子,它可以通过站在盒子旁边移动到相邻的自由单元格,然后移动到盒子的方向上。这样的举动叫做推。盒子不能用任何其他方式移动,而不是推,这意味着如果你把它推到角落里,你就再也无法把它从角落里弄出来了。
其中一个空单元被标记为目标单元格。你的工作就是通过一系列步行和推来把盒子带到目标细胞里。由于盒子很重,你想尽量减少推的次数。你能写一个程序来写出最好的这个序列吗?
输入
下面是每个包含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 推箱的更多相关文章
- poj 1475 推箱子
bfs是一层层的遍历下去,每多一层即为多走一步,因此只要遇到T就停,此时肯定是最小步数. 所以这两层bfs应为,先对箱子的最少步数进行bfs,从而求出推箱子所用最少步数: 然后箱子bfs内部嵌入人的b ...
- poj 1475 Pushing Boxes 推箱子(双bfs)
题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...
- poj 1475 || zoj 249 Pushing Boxes
http://poj.org/problem?id=1475 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=249 Pushin ...
- POJ 1475 Pushing Boxes 搜索- 两重BFS
题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...
- 【POJ 1475】 Pushing Boxes
[题目链接] http://poj.org/problem?id=1475 [算法] 双重BFS [代码] #include <algorithm> #include <bitset ...
- poj 1475 uva 589 - Pushing Boxes
题目大意 人推箱子从起点到终点,要求推箱子的次数最少,并打印出来人移动的路径. 题目分析 对于箱子进行宽搜的同时,要兼顾人是否能够把箱子推到相应的位置 每一次对箱子bfs 然后对人再bfs #incl ...
- (poj 1475) Pushing Boxes
Imagine you are standing inside a two-dimensional maze composed of square cells which may or may not ...
- Pushing Boxes POJ - 1475 (嵌套bfs)
Imagine you are standing inside a two-dimensional maze composed of square cells which may or may not ...
- poj很好很有层次感(转)
OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...
随机推荐
- Linux下安装网络软件的步骤
Linux下安装网络软件的步骤(给linux初学者,linux大神请绕路) 首先下载你所需要的软件带有deb后缀的文件 然后切换到该文件的目录 切换到超级用户权限或者是(sudo) 使用sudo dp ...
- 解决:阿里云ECS上启动tomcat后,第一次访问时间特别长
Re在ECS上启动tomcat后,第一次访问时间特别长 2017-04-25 10:16:04 INFO com.world.socket.ServerSocketListener 25- ...
- 查询编辑器便捷特性【MSSQL】
SQL Server团队为用户提供了一个便捷的特性 如果没有突出显示文本,那么按F5,执行整个批处理. 如果突出显示文本(选中SQL命令),那么只执行选中文本.
- 使用antlr4及java实现snl语言的解释器
对于antlr4的基础使用,请参考我的前一篇文章<用antlr4来实现<按编译原理的思路设计的一个计算器>中的计算器>. 其实我对于antlr4的理解也仅限于那篇文章的范围,但 ...
- mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- IOS7 状态栏和 Navigation Bar重叠的问题解决
一 Status bar重叠问题: 方法一:隐藏Status bar 在plist里面增加2个变量 Status bar is initially hidden -> YES Vie ...
- CAD控件:COM接口实现自定义实体
1. 实现步骤: 3 1. 实现步骤: 参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1) 增加自定义实体对象 调用DrawCustomEntity函数, ...
- 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 ...
- 关于ajax跨域解读
首先要了解何为跨域,(协议.域名.端口任意一个不同)的web资源.如何解决跨域:1,jsonp 它只支持GET请求而不支持POST等其它类型的HTTP请求:例如angular 中,如下使用,$http ...
- 剑指offer---最小的K个数
题目:最小的K个数 要求:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. class Solution { public: ...