POJ1475 Pushing Boxes 华丽丽的双重BFS
woc累死了写了两个半小时。。。就是BFS?我太菜了。。。
刚开始以为让人预先跑一遍BFS,然后一会儿取两节加起来就好了,结果发现求出来的最短路(就是这个意思)会因箱子的移动而变化。。。。我死了QWQ
康康书上正解:双重BFS?!!让人推箱子的时候再跑一遍BFS?!!时间不就爆炸了?!!啊n,m只有20。。。我死。。。
乖乖打正解。。结果又不知道如何传人BFS时的答案。。。想了半天。。就是开一个全局跑完人的BFS直接用就行了。。。
然后BFS跳出的时候还写错了。。否则更新不了
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define R register int
using namespace std;
const int d[][]={-,,,,,-,,};
char op[]={'n','s','w','e'},OP[]={'N','S','W','E'};
inline int g() {
R ret=; register char ch; while(!isdigit(ch=getchar()));
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
int n,m,sx,sy,tx,ty,bx,by;
char mp[][];
bool vis[][],mk[][][];
string ans;
struct node {int x,y,xx,yy; string ans; node() {}
node(int _x,int _y,int _xx,int _yy,string s):x(_x),y(_y),xx(_xx),yy(_yy),ans(s) {}
}bed,brt;
struct peo {int x,y; string ans; peo() {}
peo(int _x,int _y,string s):x(_x),y(_y),ans(s) {}
}ped,prt;
inline bool is(char ch) {return ch=='S'||ch=='T'||ch=='B'||ch=='#'||ch=='.';}
inline bool ckpos(int x,int y) {return x<||x>n||y<||y>m;}
bool bfs1(int sx,int sy,int i,int j,int xx,int yy) {
queue<peo>q;
if(ckpos(sx,sy)||mp[sx][sy]=='#') return false;
memset(vis,false,sizeof(vis)); vis[i][j]=true,vis[xx][yy]=true;
q.push(peo(xx,yy,"")); while(q.size()) {
prt=q.front(); q.pop();
if(prt.x==sx&&prt.y==sy) return true;
for(R i=;i<;++i) {
R x=prt.x+d[i][],y=prt.y+d[i][]; ped.x=x,ped.y=y;
if(ckpos(x,y)||vis[x][y]||mp[x][y]=='#') continue; vis[x][y]=true;
ped.ans=prt.ans+op[i]; q.push(ped);
}
} return false;
}
bool bfs() { queue<node>q;
q.push(node(bx,by,sx,sy,"")); while(q.size()) {
brt=q.front(); q.pop();
for(R i=;i<;++i) {
R x=brt.x+d[i][],y=brt.y+d[i][]; bed.x=x,bed.y=y;
if(brt.x==tx&&brt.y==ty) return true;
if(ckpos(x,y)||mk[x][y][i]||mp[x][y]=='#') continue;
if(bfs1(brt.x-d[i][],brt.y-d[i][],brt.x,brt.y,brt.xx,brt.yy)) {
bed.xx=brt.x,bed.yy=brt.y,bed.ans=brt.ans+prt.ans+OP[i];
mk[x][y][i]=true; q.push(bed);
}
}
} return false;
}
signed main() { R t=;
while(n=g(),m=g(),n!=) {
memset(mk,false,sizeof(mk));
for(R i=;i<=n;++i) for(R j=;j<=m;++j) {
while(!is(mp[i][j]=getchar()));
if(mp[i][j]=='S') sx=i,sy=j;
else if(mp[i][j]=='T') tx=i,ty=j;
else if(mp[i][j]=='B') bx=i,by=j;
}
printf("Maze #%d\n",++t);
if(bfs()) cout<<brt.ans<<'\n';
else printf("Impossible.\n");
putchar('\n');
}
}
2019.04.26
POJ1475 Pushing Boxes 华丽丽的双重BFS的更多相关文章
- POJ1475 Pushing Boxes(双搜索)
POJ1475 Pushing Boxes 推箱子,#表示墙,B表示箱子的起点,T表示箱子的目标位置,S表示人的起点 本题没有 Special Judge,多解时,先最小化箱子被推动的次数,再最小化 ...
- poj1475 Pushing Boxes[双重BFS(毒瘤搜索题)]
地址. 很重要的搜索题.★★★ 吐槽:算是写过的一道码量比较大的搜索题了,细节多,还比较毒瘤.虽然是一遍AC的,其实我提前偷了大数据,但是思路还是想了好长时间,照理说想了半小时出不来,我就会翻题解,但 ...
- POJ-1475 Pushing Boxes (BFS+优先队列)
Description Imagine you are standing inside a two-dimensional maze composed of square cells which ma ...
- POJ1475 Pushing Boxes(BFS套BFS)
描述 Imagine you are standing inside a two-dimensional maze composed of square cells which may or may ...
- poj1475 Pushing Boxes(BFS)
题目链接 http://poj.org/problem?id=1475 题意 推箱子游戏.输入迷宫.箱子的位置.人的位置.目标位置,求人是否能把箱子推到目标位置,若能则输出推的最少的路径,如果有多条步 ...
- Pushing Boxes POJ - 1475 (嵌套bfs)
Imagine you are standing inside a two-dimensional maze composed of square cells which may or may not ...
- poj1475 -- Pushing Boxes
这道题其实挺有趣 的,这让我想起小时候诺基亚手机上的推箱子游戏(虽然一点也不好玩) (英文不好-->) 题意翻译: 初始人(S),箱子(B),目的地(T)用人把箱子推到 T最小步数及其路径(满 ...
- POJ1475(Pushing Boxes)--bbffss
题目在这里 题目一看完就忙着回忆童年了.推箱子的游戏. 假设只有一个箱子.游戏在一个R行C列的由单位格子组成的区域中进行,每一步, 你可以移动到相邻的四个格子中的一个,前提是那个格子是空的:或者,如果 ...
- poj 1475 Pushing Boxes 推箱子(双bfs)
题目链接:http://poj.org/problem?id=1475 一组测试数据: 7 3 ### .T. .S. #B# ... ... ... 结果: //解题思路:先判断盒子的四周是不是有空 ...
随机推荐
- vim 的移动
越来也喜欢用linux的vim 来编程了,简单.高效.专业,最近拿着一本<vim的中文使用手册>在慢慢的看,看到现在就没有勇气继续看下去,我想先放一下,运用前面自己学的东西实际的去操作一下 ...
- ubuntu14.04 使用笔记
这是第二次安装使用ubuntu了,虽然上一次因为不习惯和不会使用一两天就放弃了,这次坚持的时间稍微长一点,目前ubuntu的基本使用也熟悉了.但是由于ubuntu上的应用太少,常用软件,比如QQ,Ph ...
- 用Jquery实现修改页面selecte标签的默认选择
在WEB开发中,最基础的也是用的最多的就是数据库的增删改查,修改往往以为的小部分的改动,所以我们往往是在表单中填充以前的内容然后显示给用户进行修改操作. 在填充默认内容的时候对于input标签我们往往 ...
- 面试题:Java多线程必须掌握的十个问题 背1
一.进程与线程?并行与并发? 进程代表一个运行中的程序,是资源分配与调度的基本单位.进程有三大特性: 1.独立性:独立的资源,私有的地址空间,进程间互不影响. 2.动态性:进程具有生命周期. 3.并发 ...
- Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
好像是某CF的题,不记得…… 很套路的题,但是觉得可以做一下笔记. 倍增 + 差分. 有一个比较简单的思路就是每一个点$x$向上走一走,直到走到一个点$y$使总路程恰好不超过超过了$L$,然后把$(x ...
- Luogu 3594 [POI2015]WIL-Wilcze doły
简单题. 考虑没有修改数字的条件的限制,我们直接用双指针扫描就可以计算出答案了. 然后考虑加入修改数字的条件,只要用单调队列维护出当前两个指针表示的区间中长度为$d$的一段区间的最大值,用总和减掉这个 ...
- Shiro——MD5加密
一.shiro默认密码的比对 通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对 /**源码org.apache.shiro.realm.A ...
- bootstrap强调类名
1. .lead .lead { margin-bottom: 20px; font-size: 16px; font-weight: 200; line-height: 1.4; } @medi ...
- C#获取文件的Content-Type(MIME Type)的方法
使用静态类MimeMapping(需要.NET Framework 4.5及以后的支持) string fileName = "D:\myfile.txt"; var conten ...
- 设计模式04: Factory Methord 工厂方法模式(创建型模式)
Factory Methord 工厂方法模式(创建型模式) 从耦合关系谈起耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之变更 -模块与模块之间的 ...