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

思路:IDA*可以搞,借鉴的是大牛的启发式函数h(): 可以考虑把每一行上的数转化成相同的,或者把每一列上的数字转化成相同的,二者取最小值。

1 1 3 2

2 4 4 2

3 3 1 4

1 2 3 4

如果把这个矩阵转化成行相同的话需要的操作:第一行 至少要2次,第二行也是2次, 第三行是2次,第四行是3次,  所以把矩阵转化成行相同至少要3次。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int map[][];
int maxdeep; bool Judge()
{
if(map[][]!=map[][]){
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(map[j][i]!=map[i][i])return false;
return true;
}else {
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(map[i][j]!=map[i][])return false;
return true;
}
} int Get_H()
{
int step1=,step2=;
for(int i=;i<=;i++){
int num[]={},ans=;
for(int j=;j<=;j++)num[map[i][j]]++;
for(int j=;j<=;j++)ans=max(ans,num[j]);
step1=max(step1,-ans);
}
for(int j=;j<=;j++){
int num[]={},ans=;
for(int i=;i<=;i++)num[map[i][j]]++;
for(int i=;i<=;i++)ans=max(ans,num[i]);
step2=max(step2,-ans);
}
return min(step1,step2);
} void Move_L(int i)
{
int tmp=map[i][];
for(int j=;j<=;j++)map[i][j-]=map[i][j];
map[i][]=tmp;
} void Move_R(int i)
{
int tmp=map[i][];
for(int j=;j>=;j--)map[i][j]=map[i][j-];
map[i][]=tmp;
} void Move_U(int j)
{
int tmp=map[][j];
for(int i=;i<=;i++)map[i-][j]=map[i][j];
map[][j]=tmp;
} void Move_D(int j)
{
int tmp=map[][j];
for(int i=;i>=;i--)map[i][j]=map[i-][j];
map[][j]=tmp;
} bool IDA_star(int deep)
{
if(deep==maxdeep)return Judge();
if(Get_H()+deep>maxdeep)return false; for(int i=;i<=;i++){
Move_L(i);
if(IDA_star(deep+))return true;
Move_R(i); Move_R(i);
if(IDA_star(deep+))return true;
Move_L(i);
}
for(int j=;j<=;j++){
Move_U(j);
if(IDA_star(deep+))return true;
Move_D(j); Move_D(j);
if(IDA_star(deep+))return true;
Move_U(j);
}
return false;
} int main()
{
int _case;
scanf("%d",&_case);
while(_case--){
for(int i=;i<=;i++)
for(int j=;j<=;j++)scanf("%d",&map[i][j]);
if(Judge()){
puts("");
continue;
}
maxdeep=;
while(maxdeep<=){
if(IDA_star())break;
maxdeep++;
}
if(maxdeep<=){
printf("%d\n",maxdeep);
}else
puts("-1");
}
return ;
}

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

  1. hdu 1667(IDA*)

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

  2. HDU - 1584 IDA*

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

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

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

  4. hdu 2918(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2918 思路:这道题与前面几道类似,可以说是被秒杀了!!!构造启发式函数h()=(cnt+3)/4(cn ...

  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. 使用Nginx负载均衡搭建高性能.NETweb应用程序(转)

    一.遇到的问题 当我们用IIS服务器部署了一个web应用以后,当很多用户高并发访问的时候,客户端响应就会很慢,客户的体验就会很差,由于IIS接受到客户端请求的时候,就会创建一个线程,当线程达到几千个时 ...

  2. mysql数据结构优化,范式和反范式

    1.范式,正常的建表,反范式,为了提高效率,适当的已空间换时间 2.垂直拆分,就是把经常用的.或者text大存储的字段单独拉出来存表 3.水平拆分,解决数据量大的问题,进行取莫的方式将数据放到相同的n ...

  3. Mysql中的算术运算符详解

    MySQL 支持的算术运算符包括加.减.乘.除和模运算.它们是最常使用.最简单的一类运算符.表4-1 列出了这些运算符及其作用. 下例中简单地描述了这几种运算符的使用方法: mysql> sel ...

  4. [转]sql:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询

    执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...

  5. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof

    JVM性能调优监控工具jps.jstack.jmap.jhat.jstat.hprof

  6. shell取余数

    shell取余数 技术分享 » linux | 阅读(9993) | 评论(0) Sep 3 2010 备忘脚本date取得分钟数$(()) 运算 #execute every 5 minutesa= ...

  7. Spring Boot与Spring Security整合后post数据不了,403拒绝访问

    http://blog.csdn.net/sinat_28454173/article/details/52251004 *************************************** ...

  8. FreeRTOS 临界段和开关中断

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断 ...

  9. 网页打开新窗口——Window.open()详解

    转载自:http://blog.csdn.net/business122/article/details/8281142 Window.Open详解 一.window.open()支持环境:JavaS ...

  10. span和img标签对齐

    html代码 <li> <span class="left_item">在线</span> <img class="right_ ...