P4289 [HAOI2008]移动玩具

双向bfs+状态压缩+记忆化搜索

双向bfs用于对bfs的优化,每次找到可扩展节点少的一边进行一次bfs,找到的第一个互相接触的点即为最短路径

矩阵范围仅4*4大小,我们容易想到用二进制数压缩其状态,利于求解。

既然转成二进制,大小又<2^17,那么可以再加数组进行记忆化

不要忘了起点终点相同时的特判qwq

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct data{int zip,step;};
int ans,rec1[],rec2[]; //rec:记忆化用
queue <data> h[]; //分别代表从起点/终点开始的bfs队列
inline void check(int to,int p,data x){ //检查该点是否符合条件
if(rec1[to]!=-){
if(rec2[to]!=p) ans=rec1[to]+x.step+; //如果该点已被对面搜到,那么已经得出最优解
}else{
rec1[to]=x.step+,rec2[to]=p;
h[p].push((data){to,x.step+});
}
}
void output(int t){ //检查用,将10进制数转回4*4的二进制矩阵
cout<<"---\n";
int h[];
for(int k=t,i=;i>=;--i) h[i]=k&,k>>=;
for(int i=;i<;++i){
for(int j=i*;j<=i*+;++j) cout<<h[j];
cout<<endl;
}
cout<<"---\n";
}
inline void bfs(){
int p=(h[].size()>h[].size()),now=(h[p].front()).step; //找到可扩展节点少的一边,并且只扩展一层
while(!h[p].empty()){
data x=h[p].front();
if(x.step!=now||ans) break;
h[p].pop();
int k=,to;
for(int i=;i<;i<<=,++k){ //用二进制数表示转移过程
if(!(x.zip&i)) continue;
if(k%!=&&(!(x.zip&(i<<)))){ //向左
to=x.zip-i+(i<<);
check(to,p,x);
}
if(k%!=&&(!(x.zip&(i>>)))){ //向右
to=x.zip-i+(i>>);
check(to,p,x);
}
if(k>&&(!(x.zip&(i>>)))){ //向下
to=x.zip-i+(i>>);
check(to,p,x);
}
if(k<&&(!(x.zip&(i<<)))){ //向上
to=x.zip-i+(i<<);
check(to,p,x);
}
}
}
}
int main(){
memset(rec1,-,sizeof(rec1));
char q[]; int tot1=,tot2=;
for(int i=;i<=;++i){ //矩阵转成十进制数
cin>>q;
for(int j=;j<=;++j) tot1+=q[j]-,tot1<<=;
}tot1>>=; //注意最后要右移一位
h[].push((data){tot1,}); rec1[tot1]=; rec2[tot1]=;
for(int i=;i<=;++i){
cin>>q;
for(int j=;j<=;++j) tot2+=q[j]-,tot2<<=;
}tot2>>=;
h[].push((data){tot2,}); rec1[tot2]=; rec2[tot2]=;
while(!ans&&tot1!=tot2) bfs(); //注意特判
printf("%d",ans);
return ;
}

P4289 [HAOI2008]移动玩具(bfs)的更多相关文章

  1. 【BZOJ1054】[HAOI2008]移动玩具 BFS

    [BZOJ1054][HAOI2008]移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个 ...

  2. [BZOJ1054][HAOI2008]移动玩具 bfs+hash

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2432  Solved: 1355[Submit][Stat ...

  3. bzoj 1054: [HAOI2008]移动玩具 bfs

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...

  4. P4289 [HAOI2008]移动玩具

    传送门 广搜 4*4 的方阵只有 0 和 1 显然可以状态压缩 (如样例的开始状态压缩后就是1111000011100010) 为了加快速度用了双向广搜(顺便学了一下双向广搜) 双向广搜顾名思义 就是 ...

  5. luogu P4289 [HAOI2008]移动玩具

    传送门 这道题可以二进制记录状态搜索 也可以做以下考虑 若一个棋子要移动到另一个位置上去,则步数为两点的曼哈顿距离(横坐标差的绝对值+纵坐标差的绝对值),因为假设路径上有其他的棋子,可以通过移动其他棋 ...

  6. P4289 【一本通提高篇广搜的优化技巧】[HAOI2008]移动玩具

    [HAOI2008]移动玩具 题目描述 在一个 4 × 4 4\times4 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方 ...

  7. bzoj1054: [HAOI2008]移动玩具

    hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...

  8. BZOJ 1054 [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1388  Solved: 764[Submit][Statu ...

  9. 1054: [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1272  Solved: 690[Submit][Statu ...

随机推荐

  1. POJ - 1054 The Troublesome Frog 模拟 枚举优化。

    题意:有个R*C的格网.上面有若干个点,这些点可以连成一些直线,满足:这些点在直线上均匀排布(也就是间隔相等),直线的两段穿过网格(也就是第一个,最后一个在网格的边界附近) 求某条直线上最多的点数 题 ...

  2. Centralized Cache Management in HDFS

    Overview(概述) Centralized cache management in HDFS is an explicit caching mechanism that allows users ...

  3. deque Comparison of Queue and Deque methods Comparison of Stack and Deque methods

    1. 队列queue和双端队列deque的转换 Queue Method Equivalent Deque Methodadd(e) addLast(e)offer(e) offerLast(e)re ...

  4. USB--- kvm in ubuntu:

    USB SS=USB SuperSpeed=USB 3.0!!顺应此前的USB 1.1 FullSpeed和USB 2.0 HighSpeed https://jingyan.baidu.com/ar ...

  5. Linux目录【持续更新中】

    故障排除 服务器为什么这么慢?耗尽了CPU.RAM和磁盘I/O资源 服务 ELK服务基础 基础 常用命令 curl命令 Nginx服务基础 Nginx正向代理配置 Nginx文件下载服务器 Nginx ...

  6. webpack学习三——output

    output的两个参数filename,path 一.path输出路径,输出路径要绝对路径,否则报错.做法如下: path:__dirname + 'path' 二.filename 输出文件命,相对 ...

  7. xpath教程 3 - xpath的小结

    一.xpath提取内容 1.提取节点中最表层的文本 htmlobj.xpath("./text()") 在scrapy中用extract()[0]方法抽取文本.如: temp['t ...

  8. property:get、set

    property属性:自动调用get.set方法 每次调用隐藏的数据,都用get和set方法写的字符太长,就用property解决. 方法一:使用property()函数升级get.set方法   源 ...

  9. BUG笔记:Firefox select选项右侧边框没了

    Firefox 的default select在某些情况下右侧边框会消失.截图如下: 这个目前为止没有看到有任何解决方案,HACK也没有...囧... 有高人知道吗?

  10. 12.预处理数据的方法总结(使用sklearn-preprocessing)

    https://blog.csdn.net/sinat_33761963/article/details/53433799