题目可以看IDA*学习笔记-HDU1667 The Rotation Game_ex_voda的博客-CSDN博客

关于如何存储这个条状数组,我们开一个大的矩阵数组装下来就行了。当然,特殊坐标单独开两个数组记录。

操作函数很明显要写ABCDEF啥的,很简单,写个循环就行。

我们可以想象,这里面如果123里面最多的数的个数,再用8减掉,就是至少要移动的次数,因为我们移动一次能够改变一个数。根据这个进行剪枝。并且当最多的个数是8时,已经搜索到终点。

接下来是ida*逻辑:

我们需要记录当前的深度和允许到达的深度。

如果当前全是1or2or3,则从那8个数里挑一个返回。

如果深度已经大于等于最深深度,直接返回0表示失败。

如果当前8-有效区域里边123里的最多的数的个数>最深深度减去当前深度,说明无法到达。剪枝。

从各个方向ABCDEF都走一遍,记得相反方向回溯,然后看返回值是否成功,如果成功,则记录方向,这里可以看出来方向是反过来记录的。

代码如下所示:

#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<list>
#include<vector>
#include<string>
#include<iostream>
#include<ctime>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define NN 2010
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define inf 0x3f3f3f3f
int ans[NN],a[25];
int mp[20][20],tmp[10];
int xx[]={1,1,2,2,3,3,3,3,3,3,3,4,4,5,5,5,5,5,5,5,6,6,7,7};
int yy[]={3,5,3,5,1,2,3,4,5,6,7,3,5,1,2,3,4,5,6,7,3,5,3,5};
int sum[5],op[NN],num;int esti(){sum[1]=sum[2]=sum[3]=0;sum[mp[xx[6]][yy[6]]]++;sum[mp[xx[7]][yy[7]]]++;sum[mp[xx[8]][yy[8]]]++;sum[mp[xx[11]][yy[11]]]++;sum[mp[xx[12]][yy[12]]]++;sum[mp[xx[15]][yy[15]]]++;sum[mp[xx[16]][yy[16]]]++;sum[mp[xx[17]][yy[17]]]++;return 8- max(sum[1], max(sum[2],sum[3]));
}void A(){for(int i=0;i<7;i++)mp[i][3]=mp[i+1][3];mp[7][3]=mp[0][3],mp[0][3]=0;
}
void B(){for(int i=0;i<7;i++)mp[i][5]=mp[i+1][5];mp[7][5]=mp[0][5],mp[0][5]=0;
}
void C(){for(int i=8;i>1;i--)mp[3][i]=mp[3][i-1];mp[3][1]=mp[3][8],mp[3][8]=0;
}
void D(){for(int i=8;i>1;i--)mp[5][i]=mp[5][i-1];mp[5][1]=mp[5][8],mp[5][8]=0;
}
void E(){for(int i=8;i>1;i--)mp[i][5]=mp[i-1][5];mp[1][5]=mp[8][5],mp[8][5]=0;
}
void F(){for(int i=8;i>1;i--)mp[i][3]=mp[i-1][3];mp[1][3]=mp[8][3],mp[8][3]=0;
}
void G(){for(int i=0;i<7;i++)mp[5][i]=mp[5][i+1];mp[5][7]=mp[5][0],mp[5][0]=0;
}
void H(){for(int i=0;i<7;i++)mp[3][i]=mp[3][i+1];mp[3][7]=mp[3][0],mp[3][0]=0;
}int ida(int dep, int tot){if (esti()==0) return mp[3][3];if (dep>=tot) return 0;if (esti()>tot-dep) return 0;int ans;A();ans=ida(dep+1,tot);F();if(ans){op[++num]=1;return ans;}B();ans=ida(dep+1,tot);E();if(ans){op[++num]=2;return ans;}C();ans=ida(dep+1,tot);H();if(ans){op[++num]=3;return ans;}D();ans=ida(dep+1,tot);G();if(ans){op[++num]=4;return ans;}E();ans=ida(dep+1,tot);B();if(ans){op[++num]=5;return ans;}F();ans=ida(dep+1,tot);A();if(ans){op[++num]=6;return ans;}G();ans=ida(dep+1,tot);D();if(ans){op[++num]=7;return ans;}H();ans=ida(dep+1,tot);C();if(ans){op[++num]=8;return ans;}return 0;
}int main() {while (scanf("%d",&a[0]) && a[0]){num=0;mp[xx[0]][yy[0]]=a[0];for (int i = 1; i < 24; ++i) {scanf("%d", &a[i]);mp[xx[i]][yy[i]]=a[i];}int ans = ida(0,0);if (ans){printf("No moves needed\n%d\n",ans);continue;}for (int i = 1; i <= 500; ++i) {num=0;ans = ida(0, i);if (ans){for (int j = num; j >= 1; --j) {printf("%c",op[j]+'A'-1);}puts("");printf("%d\n",ans);break;}}}return 0;
}

hdu 1667:The Rotation Game相关推荐

  1. HDU 1667 The Rotation Game

    参考文章:http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756 The portal:http://acm.hdu.edu ...

  2. 【搜索进阶】HDU 1667 The Rotation Game

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 IDA*的入门题目,状态过多容易超内存,正好体现了IDA*的优势,每次操作移动能使一个数字进入中 ...

  3. HDU 1667 The Rotation Game (A*迭代搜索)

    题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...

  4. hdu 1667 The Rotation Game(IDA*)

    题目大意: 有一个井字形结构的图形,每条线上7个数字(1,2,3,),每次可以从八个方向将一条线上的数字循环移动1个距离,问经过最少几次什么操作,可以将图形中间的八个方块变成同一种数字. 解题思路: ...

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

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

  6. hdu 1667(IDA*)

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

  7. 【HDU】3441 Rotation

    题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围.用C ...

  8. hdu 1667 IDA*

    第一道IDA*...... 给链接:点击打开链接 AC代码如下: #include <iostream> #include <cstring> #include <cst ...

  9. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

最新文章

  1. ASP.NET实现数据图表
  2. 误删除的文件夹还能恢复吗?
  3. 自然语言处理python进阶(二)
  4. CHUNGHOP k-6868万能空调遥控器的自己家用电器的代码+自己家里的宽带账号+机顶盒型号+桌子+椅子+垫子高度
  5. CompletableFuture详解~thenAcceptBoth
  6. Mysql在可视化工具navicat中如何解决输入小数变整数的问题,(改变小数位数)
  7. 【JVM】JVM指令集总结
  8. DataFountain新上计算机视觉比赛-20万巨奖数钢筋
  9. mysql自带压测工具--mysqlslap
  10. java log输出到文件路径_log4j中日志输出文件指定相对路径的方法
  11. intval0.57100 php_关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
  12. tensorflow.python.framework.tensor_shape.TensorShape 类
  13. 推荐一款非常好用的文本替换工具“Replace Pioneer”
  14. 钉钉小程序 DEMO的坑
  15. android app红点提示,技巧|手机提示软件更新的小红点逼得我强迫症犯了,怎么去掉提示?...
  16. android 取消root,彻底告别安卓刷机时代!360超级ROOT正式宣布下线:取消ROOT权限
  17. python turtle 海龟绘图详解(官方文档中文版)
  18. office2019 retail零售版转换vol批量授权版 cmd批处理命令 kms示例
  19. python游戏编程快速上手pdf_Python游戏编程快速上手 (斯维加特著) 中文pdf完整版[18MB]...
  20. c语言strcpy两字符串长度不同,(C语言)自己写字符串操作函数(一)——strlen/strcpy/strcat/strcmp/st...

热门文章

  1. 在计算机之间怎样进行软件传送,【电脑篇】巧借局域网,告别第三方工具便捷实现电脑间的文件传输...
  2. [电影]吴宇森之《喋血街頭》
  3. CAD关于块表操作(com接口c#语言)
  4. Jenkins + fastlane
  5. 记 / ENVI5.3温度反演-单窗算法-操作要点
  6. Spring Boot: Unable to start EmbeddedWebApplicationContext due to missing Embedd
  7. android adt,sdk,google map api…
  8. 面向网络舆情的关联度分析(一)
  9. 神经网络模型matlab例子,神经网络算法matlab
  10. 剑网3服务器延迟高,Win7电脑下新剑侠情缘3台服延迟高的解决方法