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

思路:这道题与前面几道类似,可以说是被秒杀了!!!构造启发式函数h()=(cnt+3)/4(cnt为不在位的点的个数)。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int map[][];
char str[];
int max_deep; int Get_H()
{
int cnt=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(map[i][j]!=(i-)*+j)cnt++;
return (cnt+)/;
} void MoveL_A()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveR_A()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveL_B()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveR_B()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveL_C()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveR_C()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveL_D()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} void MoveR_D()
{
int tmp=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=map[][];
map[][]=tmp;
} bool IDA_star(int deep)
{
if(Get_H()+deep>max_deep)return false;
if(deep==max_deep)return true; MoveL_A();
if(IDA_star(deep+))return true;
MoveR_A(); MoveR_A();
if(IDA_star(deep+))return true;
MoveL_A(); MoveL_B();
if(IDA_star(deep+))return true;
MoveR_B(); MoveR_B();
if(IDA_star(deep+))return true;
MoveL_B(); MoveL_C();
if(IDA_star(deep+))return true;
MoveR_C(); MoveR_C();
if(IDA_star(deep+))return true;
MoveL_C(); MoveL_D();
if(IDA_star(deep+))return true;
MoveR_D(); MoveR_D();
if(IDA_star(deep+))return true;
MoveL_D();
return false;
} int main()
{
int n,t=;
while(~scanf("%s",str)){
if(strcmp(str,"")==)break;
n=str[]-'';
for(int j=,i=;i<=;j++,i++){
map[(i-)/+][j]=str[i]-'';
if(i%==)j=;
}
/*
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
printf("%d ",map[i][j]);
}
printf("\n");
}*/
if(Get_H()==){
printf("%d. 0\n",t++);
continue;
}
for(max_deep=;max_deep<=n;max_deep++){
if(IDA_star())break;
}
if(max_deep>n){
printf("%d. -1\n",t++);
}else
printf("%d. %d\n",t++,max_deep);
}
return ;
}

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

  1. hdu 2234(IDA*)

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

  2. hdu 1667(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3 ...

  3. HDU - 1584 IDA*

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

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

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

  5. hdu 1813(IDA*)

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

  6. hdu 1560(IDA*)

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

  7. HDU 1560 IDA*搜索

    用N个串中找到最短的公共串(不要求连续,仅仅要相对位置一样就可以) 迭代加深搜索就可以 剪枝:当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回. #include "stdio ...

  8. HDU 2485 Destroying the bus stations (IDA*+ BFS)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2485 题意:给你n个点,m条相连的边,问你最少去掉几个点使从1到n最小路径>=k,其中不能去掉1, ...

  9. HDU 1813 Escape from Tetris (IDA*)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1813 题意:给你一个n*n的迷宫,其中0代表有一个人在这个位置,1代表墙,现在要求一个路线,使所有的人通 ...

随机推荐

  1. java FileI(O)nputStream为什么比BufferedI(O)utputStream慢?

    因为buffered多了一个缓冲区,读和写都是先把硬盘或者内存中的数据放到内存中一块缓存区域,到一定大小读写到硬盘或者内存   package io; import java.io.*; public ...

  2. 【微信小程序】request请求POST提交数据,记得要加上header

    wx.request({ url: '*******', data: { "type":"nearest_village", "district&qu ...

  3. mysql 如何查看sql语句执行时间

    查看执行时间 1 show profiles; 2 show variables;查看profiling 是否是on状态: 3 如果是off,则 set profiling = 1: 4 执行自己的s ...

  4. PHP-汇总CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI

    什么是CGI 1.CGI是HTTP协议与其他外部应用程序之间的一个接口标准 2.CGI程序或脚本(CGI程序通过HTTP服务器去执行时, 必须在CGI程序中制定其执行程序的完整路径, 使SHELL能找 ...

  5. 在Quartus中如何使用TCL脚本文件配制管脚

    quartus软件分配管脚的方法有两种,一是选择菜单“assignments->pins”进入管脚分配视图手动分配:第二种方法是利用tcl脚本文件自动分配.这里我来介绍第二种方法. 1.生成tc ...

  6. tp数据库操作

    1.常见的数据库操作//插入记录// $insert=Db::execute("insert into tp_user (username,password) values ('dome', ...

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

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

  8. Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7

    Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception processVob7 1. 1. javascript异常处理机制 ...

  9. C++之虚析构函数

    代码一. #include <iostream> using namespace std; class Base { public: Base(){}; ~Base() { cout &l ...

  10. 一款jquery和css3实现的卡通人物动画特效

    之前为大家分享了很多jquery和css3的动画实例.今天给大家带来一款非常炫的jquery和css3实现的卡通人物动画特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...