POJ1475 Pushing Boxes(双搜索)
POJ1475 Pushing Boxes
推箱子,#表示墙,B表示箱子的起点,T表示箱子的目标位置,S表示人的起点
本题没有 Special Judge,多解时,先最小化箱子被推动的次数,再最小化人移动的步数。若仍有多条路线,则按照N、S、W、E的顺序优先选择箱子的移动方向(即先上下推,再左右推)。在此前提下,再按照n、s、w、e的顺序优先选择人的移动方向(即先上下动,再左右动)。
- 每个阶段的状态包括人的位置,箱子的位置,由于每次在移动箱子之后,人的位置一定位于箱子之前的位置,所以可以将每次箱子刚刚移动后,箱子与人的位置的状态打包在一起,bfs中对于取出的队头,枚举箱子的下一个位置,然后再用一个bfs求出人由现在的位置到应该在的位置的最短步数即可
- Impossible后面没打'.',调了一上午qwq
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <queue>
#include <iostream>
#include <cmath>
using namespace std; #define N 26
#define res int
#define inf 0x3f3f3f3f const int dx[]={-,,,},dy[]={,,-,};
const char A[]={'N','S','W','E'},B[]={'n','s','w','e'};
int n,m;
char s[][]; string tmp;
struct node {
int x,y,px,py;
string ans;
}; inline bool valid(int x,int y){
return (x>= && x<=n && y>= && y<=m && s[x][y]!='#');
} bool bfs2(node a,node b)
{
tmp="";
node st;
st.x=a.px;
st.y=a.py;
st.ans="";//人的初始位置
queue<node> q;
q.push(st);
bool v[][];
memset(v,,sizeof(v));
while(q.size())
{
node now=q.front(); q.pop();
if(now.x==a.x && now.y==a.y)
{ tmp=now.ans; return true; }
for(res k= ; k< ; k++)
{
node nxt;
nxt.x=now.x+dx[k];
nxt.y=now.y+dy[k];
if(!valid(nxt.x,nxt.y)||v[nxt.x][nxt.y]) continue;
if(nxt.x==b.x && nxt.y==b.y) continue;
v[nxt.x][nxt.y]=;
nxt.ans=now.ans+B[k];
q.push(nxt);
}
}
return false;
}
node st;
string bfs1()
{
st.x=st.y=st.px=st.py=-;
st.ans="";
for(res i= ; i<=n ; i++)
for(res j= ; j<=m ; j++)
if(s[i][j]=='B')
st.x=i,st.y=j,s[i][j]='.';
else if(s[i][j]=='S')
st.px=i,st.py=j,s[i][j]='.';
queue<node> q;
int v[][][];
memset(v,,sizeof(v));
q.push(st);
string ans="Impossible.";
int cnt_box=inf,cnt_man=inf;
while(q.size())
{
node now=q.front(); q.pop();
if(s[now.x][now.y]=='T')
{
int cntb();
for(res i= ; i<now.ans.length() ; i++)
if(now.ans[i]>'A' && now.ans[i]<'Z') cntb++;
if(cntb<cnt_box || (cntb==cnt_box&& now.ans.length()-cntb<cnt_man))
cnt_box=cntb,cnt_man=now.ans.length()-cntb,ans=now.ans;
continue;
}
for(res k= ; k< ; k++)
{
node nxt; nxt.x=now.x+dx[k]; nxt.y=now.y+dy[k];
if(!valid(nxt.x,nxt.y) || v[nxt.x][nxt.y][k]) continue; node pre=now;
if(k==) pre.y=now.y-;
else if(k==) pre.y=now.y+;
else if(k==) pre.x=now.x-;
else pre.x=now.x+;//人的移动,此处x,y表示目标位置
v[nxt.x][nxt.y][k]=;
if(!valid(pre.x,pre.y) || !bfs2(pre,now)) continue;
nxt.ans=now.ans+tmp;
nxt.ans+=A[k];
nxt.px=now.x;
nxt.py=now.y;
q.push(nxt);
}
}
return ans;
} int main()
{
int Case();
while(scanf("%d %d",&n,&m)&&n&&m)
{
Case++;
for(res i= ; i<=n ; i++) cin>>(s[i]+);
cout<<"Maze #"<<Case<<endl;
cout<<bfs1()<<endl<<endl;
}
return ;
}
POJ1475 Pushing Boxes(双搜索)的更多相关文章
- poj1475 Pushing Boxes[双重BFS(毒瘤搜索题)]
地址. 很重要的搜索题.★★★ 吐槽:算是写过的一道码量比较大的搜索题了,细节多,还比较毒瘤.虽然是一遍AC的,其实我提前偷了大数据,但是思路还是想了好长时间,照理说想了半小时出不来,我就会翻题解,但 ...
- POJ1475(Pushing Boxes)--bbffss
题目在这里 题目一看完就忙着回忆童年了.推箱子的游戏. 假设只有一个箱子.游戏在一个R行C列的由单位格子组成的区域中进行,每一步, 你可以移动到相邻的四个格子中的一个,前提是那个格子是空的:或者,如果 ...
- poj1475 -- Pushing Boxes
这道题其实挺有趣 的,这让我想起小时候诺基亚手机上的推箱子游戏(虽然一点也不好玩) (英文不好-->) 题意翻译: 初始人(S),箱子(B),目的地(T)用人把箱子推到 T最小步数及其路径(满 ...
- 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)
题目链接 http://poj.org/problem?id=1475 题意 推箱子游戏.输入迷宫.箱子的位置.人的位置.目标位置,求人是否能把箱子推到目标位置,若能则输出推的最少的路径,如果有多条步 ...
- 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
woc累死了写了两个半小时...就是BFS?我太菜了... 刚开始以为让人预先跑一遍BFS,然后一会儿取两节加起来就好了,结果发现求出来的最短路(就是这个意思)会因箱子的移动而变化....我死了QWQ ...
- Pushing Boxes(广度优先搜索)
题目传送门 首先说明我这个代码和lyd的有点不同:可能更加复杂 既然要求以箱子步数为第一关键字,人的步数为第二关键字,那么我们可以想先找到箱子的最短路径.但单单找到箱子的最短路肯定不行啊,因为有时候不 ...
- [poj P1475] Pushing Boxes
[poj P1475] Pushing Boxes Time Limit: 2000MS Memory Limit: 131072K Special Judge Description Ima ...
随机推荐
- rman恢复增加ADG(级联ADG)
当前已经有一套ADG库,分别是prod1和prod1s计划从pord的ADG备库(prod1s)拷贝一个0级rman全备到新的服务器,恢复后,搭建成新增的ADG,SID叫prod2s,后面激活当做测试 ...
- class Qstring has no member named to Ascii
人家修改了.真的没有toAscii了.不过可以用toLatin1或者qPrintable()
- 如何写摘要(abstract)
- 在 CentOS 上部署 Nginx 环境
这里的案例主要通过虚拟机( vmware workstation (14) )的方式安装 Center OS 到本地环境 资源下载: vmware workstation / CentOS 本次 ...
- C# JSON使用过程中开发的小工具
我在用JSON的过程中,经常要去看一下JSON的结构,而JSON串大不部分时候都是未格式化的数据,一次我不得不用一些网页上的在线解析和格式化工具来进行格式化查看,但是这些网页有时候并不好用:因此就结合 ...
- Linux ps 进程状态码
D 不可中断睡眠(通常进程在进行I/O) R 运行中或者可运行状态(在运行队列中) S 可中断睡眠(等待event,进程idle中) ...
- java程序员修炼之前笔记(前半部分)
第一部分 用java7做开发 第一章 初始java7 java7中的新特性 switch支持String 支持100_000_000数值表示法 新的异常处理 | 连接多个异常 final Except ...
- Mac下默认JDK路径
2.JDK8以及JDK7安装的默认路径为:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk
- [LintCode笔记了解一下]44.Minimum Subarray
这道题和max subarray很类似,我用local 和 global 的dp方式阔以解决这道 那么我们来看动态规划的四个要素分别是什么? State: localmin[i] 表示以当前第i个数最 ...
- 【modelsim常见问题集锦】Can't launch the ModelSim-Altera software
一.Can't launch the ModelSim-Altera software Error: Can't launch the ModelSim-Altera software -- the ...