题目大意:略

每次选择一个最大深度K,跑IDA*

估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出..

深搜的时候暴力修改,记录操作的方向,回溯再改回来就行了,根本不用把网格压进状态里嘛..

又水了一篇博客

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define NN 2010
  6. #define ll long long
  7. #define uint unsigned int
  8. #define ull unsigned long long
  9. #define inf 0x3f3f3f3f
  10. using namespace std;
  11.  
  12. int ans[NN];
  13. int mp[][],tmp[];
  14. int xx[]={,,,,,,,,,,,,,,,,,,,,,,,};
  15. int yy[]={,,,,,,,,,,,,,,,,,,,,,,,};
  16. int sum[],op[NN],num;
  17. int esti()
  18. {
  19. int x,y;
  20. sum[]=sum[]=sum[]=;
  21. x=xx[],y=yy[],sum[mp[x][y]]++;
  22. x=xx[],y=yy[],sum[mp[x][y]]++;
  23. x=xx[],y=yy[],sum[mp[x][y]]++;
  24. x=xx[],y=yy[],sum[mp[x][y]]++;
  25. x=xx[],y=yy[],sum[mp[x][y]]++;
  26. x=xx[],y=yy[],sum[mp[x][y]]++;
  27. x=xx[],y=yy[],sum[mp[x][y]]++;
  28. x=xx[],y=yy[],sum[mp[x][y]]++;
  29. return -max(sum[],max(sum[],sum[]));
  30. }
  31. void A(){
  32. for(int i=;i<;i++)
  33. mp[i][]=mp[i+][];
  34. mp[][]=mp[][],mp[][]=;
  35. }
  36. void B(){
  37. for(int i=;i<;i++)
  38. mp[i][]=mp[i+][];
  39. mp[][]=mp[][],mp[][]=;
  40. }
  41. void C(){
  42. for(int i=;i>;i--)
  43. mp[][i]=mp[][i-];
  44. mp[][]=mp[][],mp[][]=;
  45. }
  46. void D(){
  47. for(int i=;i>;i--)
  48. mp[][i]=mp[][i-];
  49. mp[][]=mp[][],mp[][]=;
  50. }
  51. void E(){
  52. for(int i=;i>;i--)
  53. mp[i][]=mp[i-][];
  54. mp[][]=mp[][],mp[][]=;
  55. }
  56. void F(){
  57. for(int i=;i>;i--)
  58. mp[i][]=mp[i-][];
  59. mp[][]=mp[][],mp[][]=;
  60. }
  61. void G(){
  62. for(int i=;i<;i++)
  63. mp[][i]=mp[][i+];
  64. mp[][]=mp[][],mp[][]=;
  65. }
  66. void H(){
  67. for(int i=;i<;i++)
  68. mp[][i]=mp[][i+];
  69. mp[][]=mp[][],mp[][]=;
  70. }
  71.  
  72. int dfs(int dep,int ma)
  73. {
  74. if(esti()==) return mp[][];
  75. if(dep>=ma) return ;
  76. if(esti()>ma-dep) return ;
  77. int ans;
  78. A();ans=dfs(dep+,ma);F();
  79. if(ans){op[++num]=;return ans;}
  80. B();ans=dfs(dep+,ma);E();
  81. if(ans){op[++num]=;return ans;}
  82. C();ans=dfs(dep+,ma);H();
  83. if(ans){op[++num]=;return ans;}
  84. D();ans=dfs(dep+,ma);G();
  85. if(ans){op[++num]=;return ans;}
  86. E();ans=dfs(dep+,ma);B();
  87. if(ans){op[++num]=;return ans;}
  88. F();ans=dfs(dep+,ma);A();
  89. if(ans){op[++num]=;return ans;}
  90. G();ans=dfs(dep+,ma);D();
  91. if(ans){op[++num]=;return ans;}
  92. H();ans=dfs(dep+,ma);C();
  93. if(ans){op[++num]=;return ans;}
  94. return ;
  95. }
  96.  
  97. int a[];
  98. int main()
  99. {
  100. //freopen("t2.in","r",stdin);
  101. while(scanf("%d",&a[])&&a[]!=)
  102. {
  103. ull S=;num=;
  104. mp[xx[]][yy[]]=a[];
  105. for(int i=;i<;i++){
  106. scanf("%d",&a[i]);
  107. mp[xx[i]][yy[i]]=a[i];
  108. }
  109. int ans;
  110. ans=dfs(,);
  111. if(ans){
  112. printf("No moves needed\n%d\n",ans);
  113. continue;
  114. }
  115. for(int k=;k<=;k++){
  116. ans=dfs(,k);
  117. if(ans){
  118. for(int i=num;i>=;i--)
  119. printf("%c",op[i]+'A'-);
  120. puts("");
  121. printf("%d\n",ans);
  122. break;
  123. }
  124. }
  125. }
  126. return ;
  127. }

HDU 1667 The Rotation Game (A*迭代搜索)的更多相关文章

  1. hdu 1667 The Rotation Game ( IDA* )

    题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数 ...

  2. IDA*、操作打表、并行处理-The Rotation Game HDU - 1667

    万恶之源 优秀题解 用文字终究难以穷尽代码的思想 思路 每次操作都有八种选择,相当于一棵每次延申八个子节点的搜索树,故搜索应该是一种方法.而这题要求求最少步数,我们就可以想到可以试试迭代加深搜索(但其 ...

  3. HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法

    先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...

  4. hdu 1667(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3 ...

  5. 【HDOJ】1667 The Rotation Game

    1. 题目描述有个#字型的条带,可以从横线或竖线进行循环移动,求通过各种移动最终使中心的8个字符全等的长度最短并相同长度字典序最小的操作序列.2. 基本思路24个数据,8种移动方式,数据量很小了,所以 ...

  6. 【学时总结】 ◆学时·II◆ IDA*算法

    [学时·II] IDA*算法 ■基本策略■ 如果状态数量太多了,优先队列也难以承受:不妨再回头看DFS-- A*算法是BFS的升级,那么IDA*算法是对A*算法的再优化,同时也是对迭代加深搜索(IDF ...

  7. HDU 4708:Rotation Lock Puzzle

    Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. HDU 4708 Rotation Lock Puzzle(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 题目大意:给定一个方形矩阵,边长为3-10的奇数.每一圈的数字可以沿着顺时针方向和逆时针方向旋转 ...

  9. POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*

    感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...

随机推荐

  1. Unity5.X 创建基本的3D游戏场景

    点New(新建懒得写了,反正不是智障应该都会) 创建好的项目会自带一个场景,场景会自带Main Camera (主摄像机),Directional Light (方向光)   系统自带几个可以创建的3 ...

  2. CentOS 7最小安装配置网络

    安装环境: VMware Workstation14 centos 7.5.1804 最小化安装 安装过程: 在系统安装成功后进行网络配置,我这里采用的是动态ip配置.首先得知道网络配置存放的目录: ...

  3. BZOJ 2631 [国家集训队]Tree II (LCT)

    题目大意:给你一棵树,让你维护一个数据结构,支持 边的断,连 树链上所有点点权加上某个值 树链上所有点点权乘上某个值 求树链所有点点权和 (辣鸡bzoj又是土豪题,洛谷P1501传送门) LCT裸题, ...

  4. debian 9 添加源

    1.将下面内容的添加入/etc/apt/sources.list(香港镜像) #For software deb http://mirrors.ustc.edu.cn/debian/ stretch ...

  5. 紫书 习题7-13 UVa 817(dfs+栈求表达式的值)

    题目链接  点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说 ...

  6. 【codeforces 794C】Naming Company

    [题目链接]:http://codeforces.com/contest/794/problem/C [题意] 有n个位置; 两个人; 每个人都有n个字符组成的集合s1,s2(可以有重复元素); 然后 ...

  7. 【codeforces 794A】Bank Robbery

    [题目链接]:http://codeforces.com/contest/794/problem/A [题意] 每个位置上可能有物品(>=1)或是没物品 你一开始在某一个位置b; 然后你最左可以 ...

  8. Spring 7大功能模块的作用

    1.   Spring 7大功能模块的作用 1)   核心容器(Spring core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系 ...

  9. ASP.NET-Active Direcotry编程示例

    查找指定的AD帐号 using (DirectoryEntry de = new DirectoryEntry("LDAP://RootDSE")) { string DCName ...

  10. 彻底理解tomcat是怎样多线程处理http请求并将代码执行到controller里的的

    彻底理解tomcat是怎样多线程处理http请求并将代码执行到controller里的的 1.线程池,thread = threadPool.getThread(),thread.executeHtt ...