题目链接:http://acm.hdu.edu.cn/data/images/1667-1.jpg

题目是这个棋盘里面摆放着8个1,8个2和8个3,每一步你可以沿着A、B、 C、D、E、F、G、H任意一个方向移动该字母所指的长块。移出边界的小块会从 另一端移进来。如最左边的棋盘经过操作A,就会变成中间的棋盘布局, 再进行操作C,就会变成右边的棋盘布局。 要使的最中间的8个格子的数字相同,问最少需要多少步。如何 移动?(打印路径)
和八数码不一样,八数码可以用康拓展开来储存状态,同时判断状态是否已经存在过,用队列比较方便,但是这个棋盘如果用队列储存,就比较麻烦了,判断状态是否出现过,也比较麻烦。
我用的是迭代深搜,每移动一次长条,最中间的8个格子会有一个发生改变,因此可以预估大致至少多少次才能达成目的,即8-数量最多的数字的个数。首先将初始状态结点的估价函数H值设为阈值 max,然后进行深度优先搜索,搜索过程中忽略所有H值+移动步数大于 max的结点;如果没有找到解,则加大阈值max,再重复上述搜 索,直到找到一个解。

代码:

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define scanfprint() freopen("input.txt","r",stdin)
#define printfprint() freopen("output.txt","w",stdout)
#define mem(a,b) memset(a,b,sizeof(a))
const int spot=1000+10;
const int edge=100000+10;
const int maxn=24+5;
const double pi=acos(-1.0);
const int mod=1e9+7;
const double ips=0.000001;
int n,m,a[maxn],flag=0,sizes=0;
char s[1000+10];
int dir[8][7]= {1,3,7,12,16,21,23,  //8个方向2,4,9,13,18,22,24,11,10,9,8,7,6,5,20,19,18,17,16,15,14,24,22,18,13,9,4,2,23,21,16,12,7,3,1,14,15,16,17,18,19,20,5,6,7,8,9,10,11};
int h()  //估值函数
{int num[4]= {0},ans=inf;num[a[7]]++,num[a[8]]++,num[a[9]]++,num[a[12]]++,num[a[13]]++,num[a[16]]++,num[a[17]]++,num[a[18]]++;for(int i=1; i<=3; i++)ans=min(ans,8-num[i]);return ans;
}
void dfs(int step,int num)
{int f=h();if(f==0){s[sizes]='\0';printf("%s\n%d\n",s,a[8]);flag=1;return ;}if(f+num>step)return ;int temp[maxn],i,j,temp_start;memcpy(temp,a,sizeof(temp));for(i=0; i<8; i++){temp_start=a[dir[i][0]];for(j=0; j<6; j++){a[dir[i][j]]=a[dir[i][j+1]];}a[dir[i][j]]=temp_start;s[sizes++]='A'+i;dfs(step,num+1);if(flag) return ;sizes--;memcpy(a,temp,sizeof(a));}
}
void init()
{flag=0;sizes=0;
}
int main()
{int i,j,step;while(scanf("%d",&a[1])&&a[1]){init();scanf("%d",&a[2]);for(i=3; i<=24; i++)scanf("%d",&a[i]);step=h();if(!step)printf("No moves needed\n%d\n",a[8]);elsefor(;;){dfs(step,0);if(flag){break;}step++;}}return 0;
}

hdu1667The Rotation Game 迭代深搜IDA*相关推荐

  1. 埃及分数 (迭代深搜 TAT....入门)

    描述 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的.对于一个分数a/b,表示方法有很多种, ...

  2. [SOJ1039]Phone Home(深搜,染色问题)

    题目如下: 染色问题就是说,离散的点之间,如果有关联的点,这个两个点就不能是同样的颜色 然后回答最少用多少种颜色. Input There will be multiple test cases. I ...

  3. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  4. 骑士精神(双向深搜+meet in the middle)

    题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...

  5. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  6. 深入递归、深搜dfs、回溯、剪纸学习。

    深入递归,深搜dfs,回溯,剪枝 参考于博客 一.双管齐下解递归 "逐步生成结果"类问题之数值型 自下而上的递归(递推,数学归纳,动态规划) 解决简单情况下的问题. 推广到稍复杂情 ...

  7. DFS-深度优先搜索(深搜)

    深度优先搜索(Depth First Search)是搜索的手段之一.它是从某个状态开始,不断的转移状态直到无法转移,然后退回到前一步的状态,继续转移到其他的状态,如此不断的重复,直至找到最终的解. ...

  8. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

  9. 021-回溯法与深搜的关系-《算法设计技巧与分析》M.H.A学习笔记

    关于回溯法与深搜的关系,一直没有很好的搞明白,其实百度百科已经写得很好了: 回溯法的基本思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树.当探索到某一结点时 ...

最新文章

  1. The Human Touch 将人工智能和机器人用于病人工作的实际和伦理意义
  2. python对excel某一列去重-python中怎么对dataframe列去重
  3. Dynamips和Vmware完成CCVP试验(1)
  4. python -os、sys
  5. windows 默认使用python3_小白都能上手的Python3编程环境搭建 (Windows 10)
  6. 博客园北京俱乐部2009年2月28日活动
  7. vue-cli-plugin-element的使用
  8. day16前端(Dom+Jquery)
  9. HFSS报错A geometry selection is required for selection
  10. (转载)Qt中MOC的一些限制
  11. 彻底理清重载函数匹配
  12. Java远程通讯技术及原理分析
  13. 深入解析浅复制和深复制
  14. 大牛写的Openstack虚拟机创建细节
  15. FEMTO-ST轴承数据集 (IEEE PHM 2012)
  16. 餐厅收费服务器密码修改,餐厅消费管理系统-会所一卡通管理系统
  17. Win10 安装 Tomcat 解压版
  18. leapftp,leapftp中文教程加图解
  19. HTML背景透明到桌面,桌面图标背景透明的设置方法
  20. 程序员幽默:39个奇葩代码注释,每一个都能笑抽

热门文章

  1. Powerdesigner导出为excel文档
  2. 什么是DDoS攻击?DDoS攻击有哪些危害?
  3. IDC预测:2018全球物联网支出将达772亿美元
  4. Springboot巨好找招聘网站y18i5计算机毕业设计-课程设计-期末作业-毕设程序代做
  5. 世界各国电压等级及频率
  6. Printers(二) 画布Canvas定制
  7. 鲜花店如何数字化转型,鲜花店管理小程序
  8. BAM部署失败 - 未能加载”AdomdClient”或它的某一个依赖项。系统找不到指定的文件...
  9. 2018年必看最新创意手机聊天界面设计
  10. APP广告变现渠道有哪些?开发者该如何选择?