这题的难点在于移动的表示和如何标记已经访问过的图;
参考了大牛的代码:
https://www.cnblogs.com/tt123/p/3411377.html
ida做法有个好处,不需要去标记图,只要不往回走就行,ida会卡住有限步数,
在最优的步数情况下,同一个图并不会重复访问。
这是ida相对bfs的一个很大的有点。
代码如下:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int Ms[8][7] ={ 0, 2, 6,11,15,20,22,         //A    1, 3, 8,12,17,21,23,        //B  10, 9, 8, 7, 6, 5, 4,           //C   19,18,17,16,15,14,13,     //D       23,21,17,12, 8, 3, 1,        //E      22,20,15,11, 6, 2, 0,         //F   13,14,15,16,17,18,19,      //G       4, 5, 6, 7, 8, 9,10,          //H
};
int R[8] = {5,4,7,6,1,0,3,2};      //返回
int Mid[8] = {6,7,8,11,12,15,16,17},mp[30];
int ans[100];
int get(void){int t[3]={0};for(int i=0;i<8;++i){++t[mp[Mid[i]]-1];}return max(t[0],max(t[1],t[2]));
}
void Move(int x){int tmp=mp[Ms[x][0]];for(int i=0;i<6;++i){mp[Ms[x][i]]=mp[Ms[x][i+1]];}mp[Ms[x][6]]=tmp;return;
}
bool ida(int x,int depth){if(x>depth)return false;for(int i=0;i<8;++i){if(R[i]==ans[x-1])            //防止往回走continue;Move(i);ans[x]=i;int t=get();t=8-t;if(t==0)return true;if(x+t<=depth&&ida(x+1,depth))return true;Move(R[i]);}return false;
}
int main(){ans[0]=10;while(scanf("%d",&mp[0])&&mp[0]){for(int i=1;i<24;++i)scanf("%d",&mp[i]);int depth=get();if(depth==8){puts("No moves needed");printf("%d\n",mp[7]);continue;}for(depth=8-depth;1;++depth){if(ida(1,depth)){for(int i=1;i<=depth;++i){printf("%c",ans[i]+'A');}printf("\n%d\n",mp[7]);break;}}}return 0;
}

The Rotation Game hdu-1667相关推荐

  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

    题目可以看IDA*学习笔记-HDU1667 The Rotation Game_ex_voda的博客-CSDN博客 关于如何存储这个条状数组,我们开一个大的矩阵数组装下来就行了.当然,特殊坐标单独开两 ...

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

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

  5. hdu 1667 The Rotation Game(IDA*)

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

  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 1667 IDA*

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

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

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

  9. WaWa的奇妙冒险(第三周集训自闭现场)

    第三周集训自闭现场(a* ida* dbfs真的好难) (一)wlacm例题记录 A-有重复元素的排列问题 (水题,但卡我到自闭) Input Output Sample Input Sample O ...

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

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

最新文章

  1. 在IBatisNet中使用存储过程
  2. http304缓存 php,通过http头设置http缓存
  3. 过滤器filter的学习
  4. getjsonobject字符串解析出错_【干货分享】达梦DISQL工具使用解析之 DISQL环境变量设置...
  5. Oracle日期转换处理
  6. 5道不一样的Python基础题练习题,很有难度
  7. c语言socket发送excel,socket文件传输功能的实现
  8. 计算机学业水平测试题及答案初中,初中信息技术学业水平考试试题30号试题.doc...
  9. SpringBoot_web开发-引入thymeleaf
  10. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
  11. 探索Julia(part10)--自定义函数
  12. css样式 浏览器的读取顺序
  13. 摄影灵感|轮廓趋势,剪影以一种主要的方式回来了。
  14. 翻译:探索GLSL-用几何着色器(着色器库)实现法线可视化
  15. Keil uVision4 C51完整版
  16. android按键精灵兼容性,为什么逍遥android模拟器安装按键精灵总是出错
  17. 影子传文件到服务器,影子传说——文件超级隐身术
  18. 推土机距离(Wasserstein distance)以及其他几种常用的分布差异度量方法(mark)
  19. pip 查看要安装的包的所有版本的方法
  20. Ubuntu 22.04操作系统下常用软件备忘

热门文章

  1. markdown使用pandoc编译成pdf
  2. 7.2单片机入门学习之独立按键控制流水灯
  3. 00003 不思议迷宫.0006:客户端的操作如何反应到服务器?
  4. 计算机专业女生网名,说一说那些专业名字很霸气,但男女比例严重失调的专业...
  5. 缝制五彩经幡树 迎接藏历新年
  6. r星帮派颜色html,《GTA5》盘点麦克被绿过程,R星果然耍心机,一切都是定数!...
  7. 简单的网址导航,何以长盛不衰?
  8. 对接多个短信平台,该如何快速完成
  9. 哪些情况下适合发短信?
  10. linuxping百度未知的名称或服务_公司起名取名:最新简单大气的公司名称大全