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就够了,就是我的搜索代码太丑
  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. int map[][],mb[][],b[][],bs[][],q[][],h[],t[],ans;
  5. bool pd[][],flag;
  6. int hash(int b[][]){
  7. int mid=;
  8. for (int i=;i<;i++)
  9. for (int j=;j<;j++){
  10. mid=mid<<;
  11. mid=mid|b[i][j];
  12. }
  13. return mid;
  14. }
  15.  
  16. void make(int v,int b[][],int f){
  17. int mid=hash(b);
  18. if (!pd[v][mid]) {
  19. pd[v][mid]++;
  20. bs[v][mid]=f+;
  21. q[v][++t[v]]=mid;
  22. }
  23. if(pd[v^][mid]) {
  24. flag=;ans=bs[v][mid]+bs[v^][mid];//这个地方不需要-1
  25. return;
  26. }
  27. }
  28.  
  29. void bfs(int v){
  30. memset(b,,sizeof(b));
  31. int now=q[v][++h[v]],w=bs[v][now];
  32. int x=,y=;
  33. for (int i=;i<=;i++){
  34. b[x][y]=now&;
  35. now=now>>;
  36. y--; if(y==-)y=,x--;
  37. }
  38. for (int i=;i<=;i++)
  39. for (int j=;j<;j++){
  40. if (i!=&&b[i-][j]!=b[i][j]) {
  41. b[i][j]^=;b[i-][j]^=;
  42. make(v,b,w);
  43. if (flag) return;
  44. b[i][j]^=;b[i-][j]^=;
  45. }
  46. if (i!=&&b[i+][j]!=b[i][j]){
  47. b[i][j]^=;b[i+][j]^=;
  48. make(v,b,w);
  49. if (flag) return;
  50. b[i][j]^=;b[i+][j]^=;
  51. }
  52. if (j!=&&b[i][j]!=b[i][j-]){
  53. b[i][j]^=;b[i][j-]^=;
  54. make(v,b,w);
  55. if (flag) return;
  56. b[i][j]^=;b[i][j-]^=;
  57. }
  58. if (j!=&&b[i][j]!=b[i][j+]){
  59. b[i][j]^=;b[i][j+]^=;
  60. make(v,b,w);
  61. if (flag) return;
  62. b[i][j]^=;b[i][j+]^=;
  63. }
  64. }
  65. }
  66.  
  67. int main(){
  68. char s[];
  69. for (int i=;i<;i++){
  70. scanf("%s",s);
  71. for (int j=;j<;j++)
  72. map[i][j]=s[j]-'';
  73. }
  74. for (int i=;i<;i++){
  75. scanf("%s",s);
  76. for (int j=;j<;j++)
  77. mb[i][j]=s[j]-'';
  78. }
  79. h[]=h[]=;
  80. make(,map,-);make(,mb,-);
  81. while(h[]<t[]||h[]<t[]){
  82. if (h[]==t[]) bfs();
  83. if (flag) break;
  84. if (h[]==t[]) bfs();
  85. if (flag) break;
  86. if (t[]-h[]<t[]-h[]) bfs();else bfs();
  87. if (flag) break;
  88. }
  89. printf("%d",ans);
  90. }

【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. 关于MapReduce单词统计的例子:

    要统计的文件的文件名为hello hello中的内容如下 hello you hello me 通过MapReduce程序统计出文件中的各个单词出现了几次.(两个单词之间通过tab键进行的分割) im ...

  2. linux进程间通信概述

    一个大型的应用系统,往往需要众多进程协作,进程间通信的重要性显而易见. 进程间通信有如下一些目的: 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间. 共享数据: ...

  3. oracle 取随机数据

    --取随机数据 select dbms_random.value from dual; ); --百分比

  4. Java Concurrency - wait & notify, 等待通知机制

    生产者消费者问题是一个常见的多线程同步案例:一组生产者线程和一组消费者线程共享一个初始状态为空.大小为 N 的缓冲区.只有当缓冲区没满的时候,生产者才能把消息放入缓冲区,否则必须等待:只有缓冲区不空的 ...

  5. webBrowser1_DocumentCompleted不停被调用

    原文地址:http://blog.csdn.net/shuishenlong/article/details/7950576 关于DocumentCompleted事件,MSDN给出的解释是在文档加载 ...

  6. Android 第三方授权(微信篇)

    0.申请开发者: https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN 1.下载sdk包: https://o ...

  7. javascript对象初读

    <script type="text/javascript"> function baseClass() { this.showMsg = function() { a ...

  8. Spring使用总结

    一.基础JAR包 spring-beans.jar spring-context.jar spring-core.jar spring-expression.jar 二.XML的配置 1.一级结构 & ...

  9. CentOS6.6图文详细安装教程(有些设置大部分教程没出现过,附带网络设置等)

    作者:Sungeek 出处:http://www.cnblogs.com/Sungeek/ 欢迎转载,也请保留这段声明.谢谢! Centos6.6 下载地址:thunder://QUFodHRwOi8 ...

  10. Windows 右键添加「cmd 打开」

    1. 2. 3. 参考: 1.Windows右键添加"使用CMD打开" 2.WIN7.WIN8 右键在目录当前打开命令行Cmd窗口(图文)