hdu1667The Rotation Game 迭代深搜IDA*
题目链接: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*相关推荐
- 埃及分数 (迭代深搜 TAT....入门)
描述 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的.对于一个分数a/b,表示方法有很多种, ...
- [SOJ1039]Phone Home(深搜,染色问题)
题目如下: 染色问题就是说,离散的点之间,如果有关联的点,这个两个点就不能是同样的颜色 然后回答最少用多少种颜色. Input There will be multiple test cases. I ...
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- 骑士精神(双向深搜+meet in the middle)
题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...
- 深搜、广搜、搜索剪枝
搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...
- 深入递归、深搜dfs、回溯、剪纸学习。
深入递归,深搜dfs,回溯,剪枝 参考于博客 一.双管齐下解递归 "逐步生成结果"类问题之数值型 自下而上的递归(递推,数学归纳,动态规划) 解决简单情况下的问题. 推广到稍复杂情 ...
- DFS-深度优先搜索(深搜)
深度优先搜索(Depth First Search)是搜索的手段之一.它是从某个状态开始,不断的转移状态直到无法转移,然后退回到前一步的状态,继续转移到其他的状态,如此不断的重复,直至找到最终的解. ...
- 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】
图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...
- 021-回溯法与深搜的关系-《算法设计技巧与分析》M.H.A学习笔记
关于回溯法与深搜的关系,一直没有很好的搞明白,其实百度百科已经写得很好了: 回溯法的基本思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树.当探索到某一结点时 ...
最新文章
- The Human Touch 将人工智能和机器人用于病人工作的实际和伦理意义
- python对excel某一列去重-python中怎么对dataframe列去重
- Dynamips和Vmware完成CCVP试验(1)
- python -os、sys
- windows 默认使用python3_小白都能上手的Python3编程环境搭建 (Windows 10)
- 博客园北京俱乐部2009年2月28日活动
- vue-cli-plugin-element的使用
- day16前端(Dom+Jquery)
- HFSS报错A geometry selection is required for selection
- (转载)Qt中MOC的一些限制
- 彻底理清重载函数匹配
- Java远程通讯技术及原理分析
- 深入解析浅复制和深复制
- 大牛写的Openstack虚拟机创建细节
- FEMTO-ST轴承数据集 (IEEE PHM 2012)
- 餐厅收费服务器密码修改,餐厅消费管理系统-会所一卡通管理系统
- Win10 安装 Tomcat 解压版
- leapftp,leapftp中文教程加图解
- HTML背景透明到桌面,桌面图标背景透明的设置方法
- 程序员幽默:39个奇葩代码注释,每一个都能笑抽