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,就跳出.. 深搜的时候暴力修改, ...
随机推荐
- Android开发笔记(一百三十四)协调布局CoordinatorLayout
协调布局CoordinatorLayout Android自5.0之后对UI做了较大的提升.一个重大的改进是推出了MaterialDesign库,而该库的基础即为协调布局CoordinatorLayo ...
- WebForm 页面ajax 请求后台页面 方法
function ReturnOperation(InventoryID) { //入库 接口 if (confirm('你确认?')) { $.ajax({ type: "post&quo ...
- Makefile生成器,使用C++和Boost实现
今天学习了一下Boost的文件遍历功能,同一时候发现GNU编译器有-MM选项.能够自己主动生成依赖关系,于是利用以上两点写了一个Makefile生成器. 能够生成一般的单个可运行文件的Makefile ...
- 阿里云 部署并开启nodejs应用
1.下载资源 $ wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz 2.xz解压 $ xz -d node-v8. ...
- mysqldump全量备份+mysqlbinlog二进制日志增量备份
日常的数据备份及恢复测试,是DBA工作重中之重的事情,所以要做好备份及测试,日常的备份常见有mysqldump+binlog备份.xtrabackup+binlog备份,无论那一种,几乎都少不了对bi ...
- Strategy Execution with Strategy Maps and balanced score cards
4 barriers for strategy execution: - vision barrier - people barrier - resource barrier - management ...
- sql查看所有表大小的方法
sql查看所有表大小的方法. 代码: declare @id int ) declare @pages int declare @dbname sysname ,) ,) ,) create tabl ...
- atitit.面向过程的编程语言异常处理 c语言 asp vbs 的try catch 实现
atitit.面向过程的编程语言异常处理 c语言 asp vbs 的try catch 实现 1. 返回值法.and全局ERROR 变量法 1 2. 抛出异常Err.Raise 1 3. 实现try ...
- C# 获得文件名
string strFilePaht="文件路径"; Path.GetFileNameWithoutExtension(strFilePath);这个就是获取文件名的 还有的就是用 ...
- rip中的连续子网以及不连续子网
RIPv1 RIPv2 距离矢量2 距离矢量 最大跳计数15 最大跳计数15 有类的 无类的 基于广播的 基于组播224.0.09 不支持VLSM 支持VLSM 无认证 允许MD5认证 不支持不 ...