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. Saltstack实战之无master和多master

    如果不想依赖master可以设置为无master vim /etc/salt/minion 就可以通过minion来安装一个salt-master了(下来查资料做,关闭salt-minion进程因为不 ...

  2. Eigen中的基本函数 及其对应的matlab函数

    原文地址C++矩阵库 Eigen 快速入门 不仅有函数的基本形式,还有对应的matlab函数,用起来很方便. Eigen 矩阵定义 #include <Eigen/Dense> Matri ...

  3. 分析 mongodb admin local 修改ip 热修改

    分析 mongodb   admin  local 更改ip前 [root@e ~]# mongo mongodb://admin:adminpwd123@10.144.114.152 MongoDB ...

  4. $("this") $(this) 区别

    1.$("this")是使用标签选择器,查找名为this的标签2.$(this)取出当前对象并转换为jQuery对象3.$(this)是jquery对象,能调用jquery的方法, ...

  5. 2018/03/20 每日一个Linux命令 之 cp

    cp 命令用于复制文件/目录 cp [-参数] [复制文件] [复制成为的新文件] 参数(这里只介绍平常会用到的,之后的话遇到再回来补充) -f 覆盖已经存在的目标文件而不给出提示. -i 与-f选项 ...

  6. Elegant Construction---hdu5813(构造图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5813 题意是:有n个点,每个点都能到达num个点,让我们构造任意一个有向图满足条件,即:使得 i 能到 ...

  7. CF1053E Euler tour 构造

    正解:构造 解题报告: 传送门! 这种题目一般都是首先考虑合法性 这题也不例外,思考怎么样是合法的呢? 有四点: 1)a[1]=a[2n-1],显然不说 2)若a[i]=a[j],则(j-i)& ...

  8. Linux和Windows下查看环境变量方法(转)

    add by zhj: 本文中的Linux是指Ubuntu14.04 以前我对环境变量有误解,以为环境变量就是PATH这个变量.其实环境变量其实有很多,PATH仅仅是其中一个而已,比如在Windows ...

  9. tomcat访问

    1:html页面或者需要访问的对象需要放置到webapps/ROOT下面既可以  http://localhost:8080/直接访问 2:

  10. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...