IDA*(以The Ratotion Game POJ--2286 UVa1343为例)
IDA*算法实质就是迭代加深搜索和A*算法的结合,通过迭代加深搜索来寻找答案,借由预估函数h()来进行估计与剪枝。
本题主框架如下:
else for(int maxd=;;maxd++)
{
if(dfs(,maxd)) break;
}
由1开始不断加深最大深度,如果当前深度+需要到达目标的步数>最大深度时,则剪枝,需要达到目标的步数可以用函数h()表示,其返回值和计算方法由具体问题确定,本题中则是中间8个格子中最少的不同数字量。
具体代码如下:
///输入数字对应的位置
/*
00 01
02 03
04 05 06 07 08 09 10
11 12
13 14 15 16 17 18 19
20 21
22 23
*/
#include<cstdio>
#include<algorithm>
using namespace std; const int rev[] = {, , , , , , , };///每个行对应的逆行
const int center[]={,,,,,,,};
int a[];///输入
///每行对应的数字在数组a中的下标
int line[][]=
{
{ , , ,,,,}, // A
{ , , ,,,,}, // B
{, , , , , , }, // C
{,,,,,,}, // D
};
char ans[];///答案数组,存储所走步数 bool is_final()///判断是否达到题目符合条件
{
for(int i=;i<;i++)
if(a[center[i]]!=a[center[]]) return false;
return true;
} int diff(int target)///查找不同数字的数量
{
int ans=;
for(int i = ; i < ; i++)
if(a[center[i]] != target) ans++;
return ans;
} inline int h()///求最少还需要几步达到目标条件
{
return min(min(diff(), diff()), diff());
} inline void move(int i)///对相应方向进行题目中的旋转操作
{
int tmp = a[line[i][]];
for(int j = ; j < ; j++) a[line[i][j]] = a[line[i][j+]];
a[line[i][]] = tmp;
} bool dfs(int d,int maxd)///迭代搜索
{
if(is_final())
{
ans[d]='\0';
printf("%s\n",ans);
return true;
}
if(d+h()>maxd) return false;///剪枝
for(int i=;i<;i++)///对每个方向进行旋转
{
ans[d]='A'+i;
move(i);
if(dfs(d+,maxd)) return true;
move(rev[i]);///如果递归失败,调整回原来模式
}
return false;
} int main()
{
for(int i = ; i < ; i++)
for(int j = ; j < ; j++) line[i][j] = line[rev[i]][-j];///将对应方向的数字调整好
while(~scanf("%d",&a[])&&a[])
{
for(int i=; i<; i++)
{
scanf("%d",&a[i]);
if(!a[i]) return ;
}
if(is_final()) printf("No moves needed\n");
else for(int maxd=;;maxd++)
{
if(dfs(,maxd)) break;
}
printf("%d\n",a[]);
}
return ;
}
IDA*(以The Ratotion Game POJ--2286 UVa1343为例)的更多相关文章
- POJ 2286 The Rotation Game(IDA*)
The Rotation Game Time Limit: 15000MS Memory Limit: 150000K Total Submissions: 6396 Accepted: 21 ...
- POJ - 2286 - The Rotation Game (IDA*)
IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...
- POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*
感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...
- POJ 2286 The Rotation Game IDA*
(再一次感谢学长幻灯片) ID A* 随便自己yy了一下. 额嗯 思路什么的都没有问题 就是改不对.. 无奈地删代码...边删边交. 删啊删 哎呦 AC了 ... ... ... 找删的那一段 . o ...
- 【POJ 2286】 The Rotation Game
[题目链接] http://poj.org/problem?id=2286 [算法] IDA* [代码] #include <algorithm> #include <bitset& ...
- The Rotation Game (POJ 2286) 题解
[问题描述] (由于是英文的,看不懂,这里就把大意给大家说一下吧……都是中国人,相信大家也不愿意看英文……) 如图,一个井字形的棋盘,中间有着1-3任意的数,有ABCDEFGH八个操作,每个操作意味着 ...
- [poj] 2286 The Rotation Game || ID-DFS
原题 有1234四个数字,每个数字八个.有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数. 对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了. //不知道为什么都是ID ...
- 又见关系并查集 以POJ 1182 食物链为例
简单的关系并查集一般非常easy依据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离. 对于此题: 若u.v不在一个集合内,则显然此条语句会合法(暂且忽略后两条.下同). 那么将f ...
- poj很好很有层次感(转)
OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...
随机推荐
- mysql 如何在访问某张数据表按照某个字段分类输出
也许大家有时候会遇到需要将把数据库中的某张表的数据按照该表的某个字段分类输出,比如一张数据表area如下 我们需要将里面的area按照serialize字段进行分类输出,比如这种形式: areas ...
- POJ 1088 滑雪(记忆化搜索+dp)
POJ 1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 107319 Accepted: 40893 De ...
- 【Java算法】条件运算符
利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 条件运算符的表达式为: 表达式1?表达式2:表达式3 当表达式1为true ...
- 解决eclipse/myeclipse导入项目时出现红色叹号的方法
- java的类class 和对象object
java 语言的源代码是以类为单位存放在文件中,已public修饰的类名须和存放这个类的源文件名一样.而 一个源文件中只能有一个public的类,类名的首字母通常为大写. 使用public修饰的类可以 ...
- Android system :灯光系统_HAL_lights
一.android灯光系统框架: Java: frameworks/base/services/core/java/com/android/server/lights/LightsService.ja ...
- ThreadPoolExcutor
先保存一个链接,后续更新 JAVA进阶----ThreadPoolExecutor机制 ExecutorService生命周期 理解ThreadPoolExecutor源码(一)线程池的corePoo ...
- SpringMVC学习一
先看SpringMVC的视图解析 以及 摘录自http://www.cnblogs.com/HigginCui/p/5856780.html的架构解析 1.DisPatcherServlet:前 ...
- python中pass语句的作用是什么
pass语句不会执行任何操作,一般作为占位符或者创建站位程序,whileFalse:pass.
- 2019-03-04-day003-运算符
01 上周内容回顾 格式化输出: msg = '我的名字%s,我的年龄%s' % ('太白',18) 单纯的表示% msg = '我的名字%s,我的年龄%s,学习进度3%%' % ('太白',18) ...