hdu 2918(IDA*)

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

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

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 
  7 int map[4][4];
  8 char str[14];
  9 int max_deep;
 10 
 11 int Get_H()
 12 {
 13     int cnt=0;
 14     for(int i=1;i<=3;i++)
 15         for(int j=1;j<=3;j++)
 16             if(map[i][j]!=(i-1)*3+j)cnt++;
 17     return (cnt+3)/4;
 18 }
 19 
 20 void MoveL_A()
 21 {
 22     int tmp=map[1][1];
 23     map[1][1]=map[1][2];
 24     map[1][2]=map[2][2];
 25     map[2][2]=map[2][1];
 26     map[2][1]=tmp;
 27 }
 28 
 29 void MoveR_A()
 30 {
 31     int tmp=map[1][1];
 32     map[1][1]=map[2][1];
 33     map[2][1]=map[2][2];
 34     map[2][2]=map[1][2];
 35     map[1][2]=tmp;
 36 }
 37 
 38 void MoveL_B()
 39 {
 40     int tmp=map[1][2];
 41     map[1][2]=map[1][3];
 42     map[1][3]=map[2][3];
 43     map[2][3]=map[2][2];
 44     map[2][2]=tmp;
 45 }
 46 
 47 void MoveR_B()
 48 {
 49     int tmp=map[1][2];
 50     map[1][2]=map[2][2];
 51     map[2][2]=map[2][3];
 52     map[2][3]=map[1][3];
 53     map[1][3]=tmp;
 54 }
 55 
 56 void MoveL_C()
 57 {
 58     int tmp=map[2][1];
 59     map[2][1]=map[2][2];
 60     map[2][2]=map[3][2];
 61     map[3][2]=map[3][1];
 62     map[3][1]=tmp;
 63 }
 64 
 65 void MoveR_C()
 66 {
 67     int tmp=map[2][1];
 68     map[2][1]=map[3][1];
 69     map[3][1]=map[3][2];
 70     map[3][2]=map[2][2];
 71     map[2][2]=tmp;
 72 }
 73 
 74 void MoveL_D()
 75 {
 76     int tmp=map[2][2];
 77     map[2][2]=map[2][3];
 78     map[2][3]=map[3][3];
 79     map[3][3]=map[3][2];
 80     map[3][2]=tmp;
 81 }
 82 
 83 void MoveR_D()
 84 {
 85     int tmp=map[2][2];
 86     map[2][2]=map[3][2];
 87     map[3][2]=map[3][3];
 88     map[3][3]=map[2][3];
 89     map[2][3]=tmp;
 90 }
 91 
 92 bool IDA_star(int deep)
 93 {
 94     if(Get_H()+deep>max_deep)return false;
 95     if(deep==max_deep)return true;
 96     
 97     MoveL_A();
 98     if(IDA_star(deep+1))return true;
 99     MoveR_A();
100 
101     MoveR_A();
102     if(IDA_star(deep+1))return true;
103     MoveL_A();
104 
105     MoveL_B();
106     if(IDA_star(deep+1))return true;
107     MoveR_B();
108     
109     MoveR_B();
110     if(IDA_star(deep+1))return true;
111     MoveL_B();
112 
113     MoveL_C();
114     if(IDA_star(deep+1))return true;
115     MoveR_C();
116 
117     MoveR_C();
118     if(IDA_star(deep+1))return true;
119     MoveL_C();
120 
121     MoveL_D();
122     if(IDA_star(deep+1))return true;
123     MoveR_D();
124 
125     MoveR_D();
126     if(IDA_star(deep+1))return true;
127     MoveL_D();
128     return false;
129 }
130 
131 
132 int main()
133 {
134     int n,t=1;
135     while(~scanf("%s",str)){
136         if(strcmp(str,"0000000000")==0)break;
137         n=str[0]-'0';
138         for(int j=1,i=1;i<=9;j++,i++){
139             map[(i-1)/3+1][j]=str[i]-'0';
140             if(i%3==0)j=0;
141         }
142         /*
143         for(int i=1;i<=3;i++){
144             for(int j=1;j<=3;j++){
145                 printf("%d ",map[i][j]);
146             }
147             printf("\n");
148         }*/
149         if(Get_H()==0){
150             printf("%d. 0\n",t++);
151             continue;
152         }
153         for(max_deep=1;max_deep<=n;max_deep++){
154             if(IDA_star(0))break;
155         }
156         if(max_deep>n){
157             printf("%d. -1\n",t++);
158         }else 
159             printf("%d. %d\n",t++,max_deep);
160     }
161     return 0;
162 }
163 
164 
165 
166 
167 
168 
169             
View Code

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值