题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667

思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3)表示中间的八个位置中出现最多的数的个数。 因为每次操作只能改变中间8个中的一个,所以可以这样构造启发式函数。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int map[][];
int maxdeep;
char ans[]; bool Judge()
{
if(map[][]!=map[][])return false;
if(map[][]!=map[][])return false;
if(map[][]!=map[][])return false;
if(map[][]!=map[][])return false;
if(map[][]!=map[][])return false;
if(map[][]!=map[][])return false;
if(map[][]!=map[][])return false;
return true;
} int Get_H()
{
int MAX=,pos[]={};
for(int i=;i<=;i++){
pos[map[i][]]++;
pos[map[i][]]++;
}
pos[map[][]]++;
pos[map[][]]++;
for(int i=;i<=;i++)MAX=max(MAX,pos[i]);
return -MAX;
} void Move_A()
{
int tmp=map[][];
for(int i=;i<=;i++)map[i-][]=map[i][];
map[][]=tmp;
} void Move_B()
{
int tmp=map[][];
for(int i=;i<=;i++)map[i-][]=map[i][];
map[][]=tmp;
} void Move_C()
{
int tmp=map[][];
for(int i=;i>=;i--)map[][i]=map[][i-];
map[][]=tmp;
} void Move_D()
{
int tmp=map[][];
for(int i=;i>=;i--)map[][i]=map[][i-];
map[][]=tmp;
} void Move_E()
{
int tmp=map[][];
for(int i=;i>=;i--)map[i][]=map[i-][];
map[][]=tmp;
} void Move_F()
{
int tmp=map[][];
for(int i=;i>=;i--)map[i][]=map[i-][];
map[][]=tmp;
} void Move_G()
{
int tmp=map[][];
for(int i=;i<=;i++)map[][i-]=map[][i];
map[][]=tmp;
} void Move_H()
{
int tmp=map[][];
for(int i=;i<=;i++)map[][i-]=map[][i];
map[][]=tmp;
} bool IDA_star(int deep)
{
if(deep==maxdeep)return Judge();
if(Get_H()+deep>maxdeep)return false; ans[deep]='A';
Move_A();
if(IDA_star(deep+))return true;
Move_F(); ans[deep]='B';
Move_B();
if(IDA_star(deep+))return true;
Move_E(); ans[deep]='C';
Move_C();
if(IDA_star(deep+))return true;
Move_H(); ans[deep]='D';
Move_D();
if(IDA_star(deep+))return true;
Move_G(); ans[deep]='E';
Move_E();
if(IDA_star(deep+))return true;
Move_B(); ans[deep]='F';
Move_F();
if(IDA_star(deep+))return true;
Move_A(); ans[deep]='G';
Move_G();
if(IDA_star(deep+))return true;
Move_D(); ans[deep]='H';
Move_H();
if(IDA_star(deep+))return true;
Move_C();
return false;
} int main()
{
memset(map,,sizeof(map));
for(int i=;i<=;i++)map[i][]=map[i][]=;
for(int i=;i<=;i++)map[][i]=map[][i]=;
while(true){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(map[i][j]==)continue;
scanf("%d",&map[i][j]);
if(map[i][j]==)return ;
}
}
if(Judge()){
puts("No moves needed");
printf("%d\n",map[][]);
continue;
}
for(maxdeep=; ;maxdeep++){
if(IDA_star())break;
}
ans[maxdeep]='\0';
cout<<ans<<endl;
printf("%d\n",map[][]);
}
return ;
}

hdu 1667(IDA*)的更多相关文章

  1. hdu 1667 The Rotation Game ( IDA* )

    题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数 ...

  2. IDA*、操作打表、并行处理-The Rotation Game HDU - 1667

    万恶之源 优秀题解 用文字终究难以穷尽代码的思想 思路 每次操作都有八种选择,相当于一棵每次延申八个子节点的搜索树,故搜索应该是一种方法.而这题要求求最少步数,我们就可以想到可以试试迭代加深搜索(但其 ...

  3. hdu 2234(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234 思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者 ...

  4. HDU - 1584 IDA*

    思路:裸的IDA*,估计当前状态至少需要多少距离才能达到目标状态,剪枝即可.每一墩牌只需记录其最上面和最下面的牌型即可完成移动. AC代码 #include <cstdio> #inclu ...

  5. HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二

    这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...

  6. hdu 2918(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2918 思路:这道题与前面几道类似,可以说是被秒杀了!!!构造启发式函数h()=(cnt+3)/4(cn ...

  7. hdu 1813(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1813 思路:首先bfs预处理出‘0’到边界点最短距离,然后构造 h() 为所’0‘点逃离迷宫的最少步数 ...

  8. hdu 1560(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 思路:关键是启发式函数h()的构造,我们可以这样想:每次给主串增加一个字符和字符串的最后一位比较 ...

  9. HDU 1667 The Rotation Game (A*迭代搜索)

    题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...

随机推荐

  1. Java多线程具体解释

    Java多线程具体解释 多线程简单介绍 概述 多线程(multithreading).是指从软件或者硬件上实现多个线程并发运行的技术.具有多线程能力的计算机因有硬件支持而可以在同一时间运行多于一个线程 ...

  2. 【Linux】cp命令

    用途 cp除了复制功能之外还可以建立快捷方式 全称 cp的全称为copy 参数 -a :相当于同时指定参数pdr -d :若文件为链接文件的属性(link file),则复制链接文件属性而非档案本身 ...

  3. 【CentOS6.5】安装nginx报错:No package nginx available. Error: Nothing to do

    今天在给centos6.5安装nginx时候,提示报错No package nginx available. Error: Nothing to do, 后来百度一下,说缺少EPEL(epel是社区强 ...

  4. Android开发优化之——从代码角度进行优化

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻 辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点, ...

  5. Android屏幕计量单位详解

    1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多.通常不推荐使用这个. 2.dip或dp(与密度无关的像素):一个基于density的抽象单位,这 ...

  6. 三维模型 DAE 导出格式结合 OpenGLES 要素浅析

    三维模型 DAE 导出格式结合 OpenGLES 要素浅析 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&quo ...

  7. Mockito 相关资料

    https://monkeyisland.pl/2008/04/26/asking-and-telling/ http://qiuguo0205.iteye.com/blog/1456528 http ...

  8. QSettings 使用实例 当需要在程序关闭时保存”状态“信息

    用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recent files,等等这些都可以通过Qsettings来实现. 我们知 ...

  9. java运算符优先级和结合性

    运算符 结合性 [ ] . ( ) (方法调用) 从左向右 ! ~ ++ -- +(一元运算) -(一元运算) 从右向左 * / % 从左向右 + - 从左向右 << >> & ...

  10. 通过CLR API实现C++调用C#代码交互

    对于某些跨平台程序,这也就意味着只能在windows下使用了 不过最近.Net开源或许以后可以跨平台 之前花了一些时间研究COM方式调用,太繁琐不推荐. COM方式调用总结 后来尝试使用CLR C++ ...