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 ...
随机推荐
- POJ 1840 Eqs 解方程式, 水题 难度:0
题目 http://poj.org/problem?id=1840 题意 给 与数组a[5],其中-50<=a[i]<=50,0<=i<5,求有多少组不同的x[5],使得a[0 ...
- 女生可不可以进入IT行业做Linux运维工程师?
不知从何时起有那么一个不成文的理论:女生不适合做IT.在很多人看来,IT is a men’s world,女生学IT是件匪夷所思的事情.在传统的思维当中,女生只适合从事像教师.会计.公务员等稳定的职 ...
- 当你有双网络(内部网+互联网)时,如何透明NAT给其他电脑上网。虚拟机+爱快
一:简介 具体环境是这样的:单位没有提供互联网连接,都是内部网,linux服务器,无法连接源更新,docker无法pull镜像,python无法在线pip安装包. 真是郁闷到想死啊. 好在我的笔记本有 ...
- c#7的新特性
1.out关键字 //可以直接声明使用 ",out int number); 2.元组 //有点类似匿名对象的样子 //用小括号包含变量,可以当做返回值,可以当做变量赋值等 //1.当做函数 ...
- js批量上传文件
html代码: <input type="file" id='upload' name="upload" multiple="multiple& ...
- JavaScript操作BOM对象
1)windows对象 浏览器对象模型(BOM :Browser Object Model)是JavaScript的组成之一,它提供了独立于内容与浏览 器窗口进行交互的对象,使用浏览器对象模型可以 ...
- [Leetcode 739]*还有几天会升温 Daily Temperatures
[题目] Given a list of daily temperatures T, return a list such that, for each day in the input, tells ...
- 线程queue与进程queue
进程queue: from multiprocessing import Queue,Process def func(qq): qq.put('function:我要放数据,给你来取...') if ...
- Remove duplicates from array II
//Given a sorted array, remove the duplicates in place such that each element appear only // once an ...
- 用Java给数组排序
public class BubbleDemo {public static void main(String[] args) { int arr[]={1,3,5,7,2,4,6,8,9}; bub ...