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,就跳出.. 深搜的时候暴力修改, ...
随机推荐
- 转: Linux网络编程 【8】五种I/O 模式
五种I/O 模式:[1] 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O,即open和socket创建的I/O都是阻塞I/O)[2] 非阻塞 ...
- 后台管理-基于 Bootstrap 开发的网站后台管理面板
Bootstrap 开发框架真的很强大,今天推荐几个非常不错的基于 Bootstrap 开发的网站后台管理面板,全部都是响应式布局,细节做得都很不错.可以搜索keenthemes. Metronic ...
- Discuz管理员前台正常后台登录不进如何解决
Discuz管理员前台可以登录后台无法登录的解决方法步骤如下 1. 取消ip认证 config_global.php 中找到 $_config['admincp']['checkip'] = 0 2. ...
- 简述document.write和 innerHTML的区别。
document.write是重写整个document, 写入内容是字符串的htmlinnerHTML是HTMLElement的属性,是一个元素的内部html内容
- Android软件开发之EditText 详解
EditText在API中的结构 java.lang.Objectandroid.view.Viewandroid.widget.TextView android.widget.Edit ...
- Windows下Python添加库(模块)路径
动态的添加库路径.在程序运行过程中修改sys.path的值,添加自己的库路径 import syssys.path.append(r'your_path') 在Python安装目录下的\Lib\sit ...
- sql2008拒绝了对对象 (数据库 ,架构'dbo')的SELECT权限
连接sql2008的时候,出现了这种一直报权限错误:错误截图如下: 所见效果描述:在windows身份验证的 情况下登陆进去数据库的表都是可以打开的,当换到sa或者别的账号登陆进去的时候这个时候我们点 ...
- PHP垃圾回收机制引用计数器概念
参考: http://www.phpddt.com/php/gc-refcounting-basics.html
- linux下C++的man文件安装
GCC提供了一份c++的man文档,地址:ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/ 下载最新版的文档,比如:libstdc++-api.20140403 ...
- 李洪强iOS经典面试题34-求两个链表表示的数的和
李洪强iOS经典面试题34-求两个链表表示的数的和 问题 给你两个链表,分别表示两个非负的整数.每个链表的节点表示一个整数位. 为了方便计算,整数的低位在链表头,例如:123 在链表中的表示方式是: ...