hdu 1667(IDA*)
题目链接: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*)的更多相关文章
- hdu 1667 The Rotation Game ( IDA* )
题目大意: 给你一个“井”子状的board,对称的由24个方块组成,每个方块上有123三个数字中的一个.给你初始状态,共有八种变换方式,求字典序最小的最短的的变换路径使得,board中间的八个方块上数 ...
- IDA*、操作打表、并行处理-The Rotation Game HDU - 1667
万恶之源 优秀题解 用文字终究难以穷尽代码的思想 思路 每次操作都有八种选择,相当于一棵每次延申八个子节点的搜索树,故搜索应该是一种方法.而这题要求求最少步数,我们就可以想到可以试试迭代加深搜索(但其 ...
- hdu 2234(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2234 思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者 ...
- HDU - 1584 IDA*
思路:裸的IDA*,估计当前状态至少需要多少距离才能达到目标状态,剪枝即可.每一墩牌只需记录其最上面和最下面的牌型即可完成移动. AC代码 #include <cstdio> #inclu ...
- HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二
这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...
- hdu 2918(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2918 思路:这道题与前面几道类似,可以说是被秒杀了!!!构造启发式函数h()=(cnt+3)/4(cn ...
- hdu 1813(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1813 思路:首先bfs预处理出‘0’到边界点最短距离,然后构造 h() 为所’0‘点逃离迷宫的最少步数 ...
- hdu 1560(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 思路:关键是启发式函数h()的构造,我们可以这样想:每次给主串增加一个字符和字符串的最后一位比较 ...
- HDU 1667 The Rotation Game (A*迭代搜索)
题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...
随机推荐
- machine_learning-knn算法具体解释(近邻算法)
近邻算法是机器学习算法中的入门算法,该算法用于针对已有数据集对未知数据进行分类. 该算法核心思想是通过计算预測数据与已有数据的相似度猜測结果. 举例: 如果有例如以下一组数据(在下面我们统一把该数据作 ...
- windows下MongoDB的安装,配置与开机自启动
关于简介不多说百度去吧少年.. MongoDB详细安装: 1.进入官网,点击DOWNLOAD MONGODB,下载所需要的版本.. 我这里把下载的文件放在d\MongoDB文件夹下,点击下载的官方镜像 ...
- Vue2.0+Webpack项目环境构建到发布
前言:为什么要用webpack搭建项目呢,因为这个工具可以把目前浏览器不全部支持的ES6语法,通过打包工具生成所有浏览器都支持的单个JS文件. 参考: https://blog.csdn.net/u0 ...
- CYQ学习主要摘要3
1:MAction:增加ResetTable功能 增加ResetTable功能:减少New MAction的个数2:MAction:增加在Update/Insert/Fill/ResetTable失 ...
- API Management Architecture Notes
Kong/Tyk/Zuul/strongloop/Ambassador/Gravitee IBM Reference Architecture for API Management: https:// ...
- 每日英语:The First Day On A Job Is Tough Work
Why is the first day on the job often the worst? New employees tend to be greeted with stacks of ben ...
- iptables安装失败后-------------firewalld回归
yum install firewalld systemctl stop iptables; systemctl mask iptables; systemctl unmask firewalld s ...
- 第八课:不一样的链表 linux链表设计哲学 5星级教程
这一课最后实现的链表,和普通链表不同,借鉴了linux内核链表的思想,这也是企业使用的链表. 基础介绍: 顺序表的思考 顺序表的最大问题是插入和删除需要移动大量的元素!如何解决?A:在线性表数据元素之 ...
- windows下wim配置成IDE
1.配置文件_wimrc set fileencodings=utf-,ucs-bom,cp936,big5 set fileencoding=utf- source $VIMRUNTIME/vimr ...
- QT在CT上的安装及运行
http://www.cubie.cc/forum.php?mod=viewthread&tid=2662&highlight=qt