题目链接: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次。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6
  7 int map[5][5];
  8 int maxdeep;
  9
 10 bool Judge()
 11 {
 12     if(map[1][1]!=map[1][2]){
 13         for(int i=1;i<=4;i++)
 14             for(int j=1;j<=4;j++)
 15                 if(map[j][i]!=map[i][i])return false;
 16         return true;
 17     }else {
 18         for(int i=1;i<=4;i++)
 19             for(int j=1;j<=4;j++)
 20                 if(map[i][j]!=map[i][1])return false;
 21         return true;
 22     }
 23 }
 24
 25 int Get_H()
 26 {
 27     int step1=0,step2=0;
 28     for(int i=1;i<=4;i++){
 29         int num[5]={0},ans=0;
 30         for(int j=1;j<=4;j++)num[map[i][j]]++;
 31         for(int j=1;j<=4;j++)ans=max(ans,num[j]);
 32         step1=max(step1,4-ans);
 33     }
 34     for(int j=1;j<=4;j++){
 35         int num[5]={0},ans=0;
 36         for(int i=1;i<=4;i++)num[map[i][j]]++;
 37         for(int i=1;i<=4;i++)ans=max(ans,num[i]);
 38         step2=max(step2,4-ans);
 39     }
 40     return min(step1,step2);
 41 }
 42
 43 void Move_L(int i)
 44 {
 45     int tmp=map[i][1];
 46     for(int j=2;j<=4;j++)map[i][j-1]=map[i][j];
 47     map[i][4]=tmp;
 48 }
 49
 50 void Move_R(int i)
 51 {
 52     int tmp=map[i][4];
 53     for(int j=4;j>=2;j--)map[i][j]=map[i][j-1];
 54     map[i][1]=tmp;
 55 }
 56
 57 void Move_U(int j)
 58 {
 59     int tmp=map[1][j];
 60     for(int i=2;i<=4;i++)map[i-1][j]=map[i][j];
 61     map[4][j]=tmp;
 62 }
 63
 64 void Move_D(int j)
 65 {
 66     int tmp=map[4][j];
 67     for(int i=4;i>=2;i--)map[i][j]=map[i-1][j];
 68     map[1][j]=tmp;
 69 }
 70
 71
 72 bool IDA_star(int deep)
 73 {
 74     if(deep==maxdeep)return Judge();
 75     if(Get_H()+deep>maxdeep)return false;
 76
 77     for(int i=1;i<=4;i++){
 78         Move_L(i);
 79         if(IDA_star(deep+1))return true;
 80         Move_R(i);
 81
 82         Move_R(i);
 83         if(IDA_star(deep+1))return true;
 84         Move_L(i);
 85     }
 86     for(int j=1;j<=4;j++){
 87         Move_U(j);
 88         if(IDA_star(deep+1))return true;
 89         Move_D(j);
 90
 91         Move_D(j);
 92         if(IDA_star(deep+1))return true;
 93         Move_U(j);
 94     }
 95     return false;
 96 }
 97
 98 int main()
 99 {
100     int _case;
101     scanf("%d",&_case);
102     while(_case--){
103         for(int i=1;i<=4;i++)
104             for(int j=1;j<=4;j++)scanf("%d",&map[i][j]);
105         if(Judge()){
106             puts("0");
107             continue;
108         }
109         maxdeep=1;
110         while(maxdeep<=5){
111             if(IDA_star(0))break;
112             maxdeep++;
113         }
114         if(maxdeep<=5){
115             printf("%d\n",maxdeep);
116         }else
117             puts("-1");
118     }
119     return 0;
120 }

View Code

hdu 2234(IDA*)相关推荐

  1. HDU 2234 IDA*

    无题I Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  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 1667 IDA*

    第一道IDA*...... 给链接:点击打开链接 AC代码如下: #include <iostream> #include <cstring> #include <cst ...

  4. hdu 1667 The Rotation Game(IDA*)

    题目大意: 有一个井字形结构的图形,每条线上7个数字(1,2,3,),每次可以从八个方向将一条线上的数字循环移动1个距离,问经过最少几次什么操作,可以将图形中间的八个方块变成同一种数字. 解题思路: ...

  5. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  6. HDU ACM Steps 攻略

    HDU ACM Steps 攻略- Admin 2011年10月14日 名人名言:未来是光明而美丽的,爱它吧,向它突进,为它工作,迎接它,尽可能地使它成为现实吧!--车尔尼雪夫斯基 总结了一下ACM ...

  7. hdu 1043 ,pku 1077 Eight ,八数码问题

    某位神牛曾说过,此题是涉及到人生完不完整的一道题.. Goodness大牛曾总结了 八数码的八重境界 : http://www.cnblogs.com/goodness/archive/2010/05 ...

  8. HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法

    先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...

  9. HDU ACM Steps攻略 ACM Steps的全部内容

    原地址:http://www.byywee.com/page/M0/S607/607452.html 总结了一下ACM STEPS的各章内容,趁便附上我的Steps题号(每人的不一样). 别的,此文首 ...

最新文章

  1. java-number2
  2. iOS开发之功能模块--推送之坑问题解决
  3. 网络安全概念是什么?互联网时代它为何如此重要?
  4. 小师妹学JVM之:JIT中的PrintAssembly续集
  5. 编译原理简单语法分析器(first,follow,分析表)源码下载
  6. 我们每天努力上班赚钱,财富离我们很远
  7. 插值问题(拉格朗日插值、牛顿插值)
  8. Android库和项目收集-图片
  9. 喜庆博客积分排名进入前3万
  10. 带你极速掌握EMU8086汇编工具,深刻理解微机原理(含安装与快速上手教程)
  11. Java IO 和 NIO的区别
  12. 第十七部分 Istio控制 Egress 流量
  13. 将word 转换为图片(word to pdf ->pdf to image)
  14. 镜头camera shot
  15. 网易云信-IM即时通讯 微信小程序端实现
  16. BZMCTF:流量监控平台
  17. MIPI CSI-2笔记(2) -- 物理层Physical Layer
  18. Vue的localStorage缓存遗留问题
  19. C# 创建和删除虚拟目录
  20. Java多key单value的Map应用场景

热门文章

  1. 驰声科技推出AI对话考辅系统 将VR引入语音评测
  2. Docker容器系列教程(三):jenkins环境搭建与插件安装
  3. MySQL远程连接ERROR 2003 (HY000) Cant connect to MySQL server on (10060)
  4. 使用ionic2开发一个登录功能
  5. 更改linux主机名称
  6. 九度OJ 1035:找出直系亲属(二叉树)
  7. 谈谈MVC项目中的缓存功能设计的相关问题
  8. java NIO 复习
  9. 如何选择商业智能BI工具
  10. 大数据实时分析平台应用在哪些场景