Description

在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。

Input

前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

Output

一个整数,所需要的最少移动次数。

Sample Input

1111
0000
1110
0010

1010
0101
1010
0101

Sample Output

4
 
这个题貌似在哪见过,然后找不到了
其实也不需要见过,双向BFS就够了,就是我的搜索代码太丑
 #include<cstdio>
#include<cstring>
using namespace std;
int map[][],mb[][],b[][],bs[][],q[][],h[],t[],ans;
bool pd[][],flag;
int hash(int b[][]){
int mid=;
for (int i=;i<;i++)
for (int j=;j<;j++){
mid=mid<<;
mid=mid|b[i][j];
}
return mid;
} void make(int v,int b[][],int f){
int mid=hash(b);
if (!pd[v][mid]) {
pd[v][mid]++;
bs[v][mid]=f+;
q[v][++t[v]]=mid;
}
if(pd[v^][mid]) {
flag=;ans=bs[v][mid]+bs[v^][mid];//这个地方不需要-1
return;
}
} void bfs(int v){
memset(b,,sizeof(b));
int now=q[v][++h[v]],w=bs[v][now];
int x=,y=;
for (int i=;i<=;i++){
b[x][y]=now&;
now=now>>;
y--; if(y==-)y=,x--;
}
for (int i=;i<=;i++)
for (int j=;j<;j++){
if (i!=&&b[i-][j]!=b[i][j]) {
b[i][j]^=;b[i-][j]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i-][j]^=;
}
if (i!=&&b[i+][j]!=b[i][j]){
b[i][j]^=;b[i+][j]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i+][j]^=;
}
if (j!=&&b[i][j]!=b[i][j-]){
b[i][j]^=;b[i][j-]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i][j-]^=;
}
if (j!=&&b[i][j]!=b[i][j+]){
b[i][j]^=;b[i][j+]^=;
make(v,b,w);
if (flag) return;
b[i][j]^=;b[i][j+]^=;
}
}
} int main(){
char s[];
for (int i=;i<;i++){
scanf("%s",s);
for (int j=;j<;j++)
map[i][j]=s[j]-'';
}
for (int i=;i<;i++){
scanf("%s",s);
for (int j=;j<;j++)
mb[i][j]=s[j]-'';
}
h[]=h[]=;
make(,map,-);make(,mb,-);
while(h[]<t[]||h[]<t[]){
if (h[]==t[]) bfs();
if (flag) break;
if (h[]==t[]) bfs();
if (flag) break;
if (t[]-h[]<t[]-h[]) bfs();else bfs();
if (flag) break;
}
printf("%d",ans);
}

【BZOJ 1054】 [HAOI2008]移动玩具的更多相关文章

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

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

  2. BZOJ 1054 [HAOI2008]移动玩具

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

  3. BZOJ 1054: [HAOI2008]移动玩具(bfs)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...

  4. 1054: [HAOI2008]移动玩具

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

  5. 【BZOJ】1054: [HAOI2008]移动玩具(bfs+hash)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1054 一开始我还以为要双向广搜....但是很水的数据,不需要了. 直接bfs+hash判重即可. # ...

  6. 1054: [HAOI2008]移动玩具 - BZOJ

    Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动 ...

  7. 1054. [HAOI2008]移动玩具【BFS】

    Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移 ...

  8. [HAOI 2005][BZOJ 1054] 移动玩具

    先贴一波题面 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2288  Solved: 1270 Descr ...

  9. BZOJ 1054 题解

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

  10. BZOJ 1054 广搜

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

随机推荐

  1. HDU 1043 Eight (A* + HASH + 康托展开)

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. Flexible 弹性盒子模型之CSS flex-direction

    实例 设置 <div> 元素内弹性盒元素的方向为相反的顺序: div { display:flex; flex-direction:row-reverse; } 复制 效果预览 浏览器支持 ...

  3. IIS 发布网站到外网

    前段时间做了一个项目在局域网中测试后要发布到外网上,一时间不知怎么搞,以为直接在IIS中修改发布时的IP就可以了,但是不可行,经过摸索终于成功发布到外网,下面是具体步骤. 前期准备:公网IP,掩码,网 ...

  4. css3 巧用结构性伪类选择器

    最近在国外的一个网站上看到的一个关于结构性伪类选择器的用法,觉得十分实用,就自己尝试了一下,并把它给记录下来: 这是最基本的样式: <style type="text/css" ...

  5. AIDL实现Android IPC

    1.AIDL文本解释 在软件工程中,接口定义语言(IDL)已经成为通用术语,是用来描述软件组件接口的特定语言.在Android中,该IDL被称为Android接口定义语言(AIDL),它是纯文本文件, ...

  6. ifndef/define/endif作用和用法

    问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译,偶只知道这个概念不懂的是怎么个用法,和为什么要用它~~高手请指点一下~~谢谢~~~!!! ------------- ...

  7. iMAC——查看开机关机时间

    每次下班都记不好早上几点打的卡,你是不是也经常有这样的情况:  那就用以下的代码考到Mac电脑的终端中,回车: mac终端输入上面命令行 查看开机时间: last | grep reboot 查看关机 ...

  8. JavaScript代码检查工具 — JSHint

    静态代码检查是开发工作中不可缺少的一环,毕竟对于程序化的工作人的眼睛是不可靠的,更何况是自己的眼睛看自己的代码.即使最后的运行结果通过,但可能存在一些未定义的变量.定义了但最后没用过的变量.分号有没有 ...

  9. 在慕课学习Bootstrap

    ---恢复内容开始--- 可以用class=“h1”等给元素加h1样式 <h>------<small>----</small></h>     < ...

  10. javascript笔记---貌似大叔

    1.原型式继承和类式继承的区别 在基于类的面向对象方式中,对象(object)依靠类(class)来产生.而在基于原型的面向对象方式中,对象(object)则是依靠 构造器(constructor)利 ...