博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2234(IDA*)
阅读量:6589 次
发布时间:2019-06-24

本文共 2981 字,大约阅读时间需要 9 分钟。

题目链接:

思路: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
2 #include
3 #include
4 #include
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

 

转载地址:http://elzio.baihongyu.com/

你可能感兴趣的文章
Microsoft.AlphaImageLoader滤镜解说
查看>>
Could not drop object &#39;student&#39; because it is referenced by a FOREIGN KEY constraint
查看>>
The OpenGL pipeline
查看>>
extjs_02_grid(显示本地数据,显示跨域数据)
查看>>
Tokyo Tyrant(TTServer)系列(四)-tcrmgr远程管理与调试
查看>>
超过响应缓冲区限制
查看>>
SQL基础--&gt; 约束(CONSTRAINT)
查看>>
ubuntu 下安装 matplotlib
查看>>
偶的新的一天
查看>>
webservice的几个简单概念
查看>>
HttpSolrServer 实例管理参考,来自org.eclipse.smila.solr
查看>>
java网络编程
查看>>
JPA学习笔记1——JPA基础 (转自CSDN)
查看>>
C#:判断当前程序是否通过管理员运行
查看>>
JVM:如何分析线程堆栈
查看>>
sparse linear regression with beta process priors
查看>>
比你优秀的人都在努力
查看>>
XSS学习笔记(四)-漏洞利用全过程
查看>>
克隆复制可使用原型( Prototype)设计模式
查看>>
正向代理与反向代理的区别(转)
查看>>