题目链接: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. proc文件系统分析

    来源: ChinaUnix博客 日期: 2008.01.03 11:46 (共有条评论) 我要评论   二 proc文件系统分析  根据前面的分析,我们可以基本确定对proc文件系统的分析步骤.我将按 ...

  2. Linux环境源码编译安装SVN

    zhoulf 2015/2/28 原创 安装说明 安装环境:Red Hat Enterprise Linux 安装方式:源码安装 软件:apr-1.5.0.tar.gz.apr-iconv-1.2.1 ...

  3. jquery 属性操作 attr( ) prop()css( )区别

    一 attr () 和 prop( ) 操作属性 谈谈我的总结: 1 2 1 属性的定义,根据W3C手册所述:属性包括,标准属性:id class style title 语言属性 lang dir以 ...

  4. C#:Application操作(待补充)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Python3 isprintable() 方法

    描述 判断字符串中所有字符是否都是可打印字符(in repr())或字符串为空. Unicode字符集中“Other” “Separator”类别的字符为不可打印的字符(但不包括ASCII码中的空格( ...

  6. Mysql5.7的初始密码更改

    软件版本的变化真是让人兴奋…… Linux服务器决定安装使用mysql 5.7了. 愉快的去官网下载安装包:https://dev.mysql.com/downloads/mysql/ 解决完所有依赖 ...

  7. 硬盘Raid

    一.raid什么意思? RAID是“Redundant Array of Independent Disk”的缩写,raid什么意思了?说白了,中文翻译过来通俗的讲就是磁盘阵列的意思,也就是说RAID ...

  8. bootstrap-fileinput文件上传组件和laravel引用(未完)

    前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...

  9. unity, Rigidbody.constraints

    一,同时施加多个限制: 用按位或(bitwise OR)实现,例如: GetComponent<Rigidbody>().constraints=RigidbodyConstraints. ...

  10. centos系统字符编码问题

    1.cat /etc/locale.conf LANG="en_US.UTF-8" 2./etc/profile.d/lang.sh这个文件要有且可以正常执行(检查/sbin/co ...