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为例)的更多相关文章

  1. POJ 2286 The Rotation Game(IDA*)

    The Rotation Game Time Limit: 15000MS   Memory Limit: 150000K Total Submissions: 6396   Accepted: 21 ...

  2. POJ - 2286 - The Rotation Game (IDA*)

    IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...

  3. POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*

    感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...

  4. POJ 2286 The Rotation Game IDA*

    (再一次感谢学长幻灯片) ID A* 随便自己yy了一下. 额嗯 思路什么的都没有问题 就是改不对.. 无奈地删代码...边删边交. 删啊删 哎呦 AC了 ... ... ... 找删的那一段 . o ...

  5. 【POJ 2286】 The Rotation Game

    [题目链接] http://poj.org/problem?id=2286 [算法] IDA* [代码] #include <algorithm> #include <bitset& ...

  6. The Rotation Game (POJ 2286) 题解

    [问题描述] (由于是英文的,看不懂,这里就把大意给大家说一下吧……都是中国人,相信大家也不愿意看英文……) 如图,一个井字形的棋盘,中间有着1-3任意的数,有ABCDEFGH八个操作,每个操作意味着 ...

  7. [poj] 2286 The Rotation Game || ID-DFS

    原题 有1234四个数字,每个数字八个.有八种方向的移动,使得操作后中间八个方块的数字相同,求最小操作步数. 对于这种求最小步数的看起来就是dfs的题,就ID-DFS就好了. //不知道为什么都是ID ...

  8. 又见关系并查集 以POJ 1182 食物链为例

    简单的关系并查集一般非常easy依据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离. 对于此题: 若u.v不在一个集合内,则显然此条语句会合法(暂且忽略后两条.下同). 那么将f ...

  9. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

随机推荐

  1. 移动端常用的 meta设置

    <meta charset="utf-8"> <meta name="viewport" content="width=device ...

  2. 【CSV文件】CSV文件内容读取

    CSV(逗号分隔值文件格式) 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本 ...

  3. String和StringBuffer互相转换

    String:不可变 StringBuffer:可变 StringBuffer 上的任何修改性的操作都是在同一个字符数组上进行的,所以修改其中任一个值 另一个的值也会随着改变! StringBuffe ...

  4. asp.net webapi 返回json结果的方法

    第一种: public static void Register(HttpConfiguration config) { //1.将默认的xml格式化程序清除 GlobalConfiguration. ...

  5. react与vue的对比

    模板: Vue Vue应用的默认选项是把markup放在HTML文件中. 数据绑定表达式采用的是和Angular相似的mustache语法,而指令(特殊的HTML属性)用来向模板添加功能. React ...

  6. 网页的MVC模式简介

    #! /usr/bin/env python3 # -*- coding:utf-8 -*- #MVC:Model-View-Controller 模型-视图-控制器 #Python处理URL的函数就 ...

  7. 房间安排 (nyoj 168)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=168 分析:找到一天中需要最多的房间即可 #include<iostream> ...

  8. VSTO杂项拾零(持续更新中……)

    环境:win 7+visual basic 2008     侧重:VSTO     界面:sheetbook工作簿 1.创建一个过程并调用(2017.6.3) Public Class Sheet1 ...

  9. translclude

    .transclude:true 启用transclude,启用以后,有两个地方会发生变化: ①.使用指令的元素内部的所有内容都会被保存起来.不妨先把这一段内容称为一坨. 比如指令元素是这样的: &l ...

  10. 虚拟机中扩展linux系统存储空间

    reference: https://blog.csdn.net/greenapple_shan/article/details/52799631 https://blog.csdn.net/lyd1 ...