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. 程氏CMS去掉静态页面的隐藏性版权方法

    程氏CMS去掉静态页面的隐藏性版权方法 实例如图: 因为之前自己找了好久都没找到这俩代码写在那个文件夹的,经过跟csqq8讨论了也没有得到结果,今天突然发现,原来这些代码都经过base64加密,用加密 ...

  2. 转载js实现打印功能

    <div id="print">打印的内容</div><a href="javascript:void(0)" onclick=& ...

  3. html accesskey (단축키 지정)

    accesskey 속성은 마우스 등을 쓰지 않는 환경을 위해 링크나 입력 폼에서 키보드의 키 입력만으로 동작을 실행할 수 있도록 accesskey 속성값에 access 할 영어 또 ...

  4. Linux 命令 - cat: 合并文件至标准输出

    命令格式 cat [OPTION]... [FILE]... 命令参数 -A, --show-all 等价于 -vET. -b, --number-nonblank 对非空输出行编号. -e 等价于 ...

  5. JavaScript之图片轮换

    <!doctype html> <title>javascript图片轮换</title> <meta charset="utf-8"/& ...

  6. VR开发中性能问题—OculusWaitForGPU

    http://blog.csdn.net/cartzhang/article/details/50788894 VR开发中性能问题-OculusWaitForGPU 本文章由cartzhang编写,转 ...

  7. 用命令行将Java程序打包为jar文件

    如何把写好的Java程序打包为jar文件呢?有两种方式可以选择 1.命令行的方式: 打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf MyApp.jar D:Jav ...

  8. HTML+CSS学习笔记(4) - 认识标签(3)

    HTML+CSS学习笔记(4) - 认识标签(3) 1.使用<a>标签,链接到另一个页面 使用<a>标签可实现超链接,它在网页制作中可以说是无处不在,只要有链接的地方,就会有这 ...

  9. Linux 配置

    零:个性化 主题:Radiance 主题颜色: gtk-color-scheme = "base_color:#CCE8CF\nfg_color:#006400\ntooltip_fg_co ...

  10. JavaScript正则实战

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...