hdu 2234(IDA*)
题目链接: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*)相关推荐
- HDU 2234 IDA*
无题I Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- hdu 1667(IDA*)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3); max(1,2,3 ...
- hdu 1667 IDA*
第一道IDA*...... 给链接:点击打开链接 AC代码如下: #include <iostream> #include <cstring> #include <cst ...
- hdu 1667 The Rotation Game(IDA*)
题目大意: 有一个井字形结构的图形,每条线上7个数字(1,2,3,),每次可以从八个方向将一条线上的数字循环移动1个距离,问经过最少几次什么操作,可以将图形中间的八个方块变成同一种数字. 解题思路: ...
- hdu与poj题目分类
POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...
- HDU ACM Steps 攻略
HDU ACM Steps 攻略- Admin 2011年10月14日 名人名言:未来是光明而美丽的,爱它吧,向它突进,为它工作,迎接它,尽可能地使它成为现实吧!--车尔尼雪夫斯基 总结了一下ACM ...
- hdu 1043 ,pku 1077 Eight ,八数码问题
某位神牛曾说过,此题是涉及到人生完不完整的一道题.. Goodness大牛曾总结了 八数码的八重境界 : http://www.cnblogs.com/goodness/archive/2010/05 ...
- HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...
- HDU ACM Steps攻略 ACM Steps的全部内容
原地址:http://www.byywee.com/page/M0/S607/607452.html 总结了一下ACM STEPS的各章内容,趁便附上我的Steps题号(每人的不一样). 别的,此文首 ...
最新文章
- java-number2
- iOS开发之功能模块--推送之坑问题解决
- 网络安全概念是什么?互联网时代它为何如此重要?
- 小师妹学JVM之:JIT中的PrintAssembly续集
- 编译原理简单语法分析器(first,follow,分析表)源码下载
- 我们每天努力上班赚钱,财富离我们很远
- 插值问题(拉格朗日插值、牛顿插值)
- Android库和项目收集-图片
- 喜庆博客积分排名进入前3万
- 带你极速掌握EMU8086汇编工具,深刻理解微机原理(含安装与快速上手教程)
- Java IO 和 NIO的区别
- 第十七部分 Istio控制 Egress 流量
- 将word 转换为图片(word to pdf ->pdf to image)
- 镜头camera shot
- 网易云信-IM即时通讯 微信小程序端实现
- BZMCTF:流量监控平台
- MIPI CSI-2笔记(2) -- 物理层Physical Layer
- Vue的localStorage缓存遗留问题
- C# 创建和删除虚拟目录
- Java多key单value的Map应用场景