BZOJ SCOI2005骑士精神

裸IDA*,ans从1到15循环来限制搜索深度。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int d,s[6][6],ans;
 6 char c;
 7 bool flag;
 8 int ma[6][6]={{0,0,0,0,0,0},
 9               {0,1,1,1,1,1},
10               {0,0,1,1,1,1},
11               {0,0,0,2,1,1},
12               {0,0,0,0,0,1},
13               {0,0,0,0,0,0}},dx[8]={1,2,2,1,-1,-2,-2,-1},dy[8]={2,1,-1,-2,-2,-1,1,2};
14 void swap(int &a,int &b){int c=a;a=b;b=c;}
15 bool check()
16 {
17     int i,j;
18     for (i=1;i<=5;++i)for (j=1;j<=5;++j)if (s[i][j]!=ma[i][j]) return 0;
19     return 1;
20 }
21 bool f(int g)
22 {
23     int h=0,i,j;
24     for (i=1;i<=5;++i)for (j=1;j<=5;++j)if (s[i][j]!=ma[i][j])
25     {h++; if (g+h>ans) return 0;}
26     return 1;
27 }
28 void dfs(int x,int y,int g)
29 {
30     if (g==ans)
31     {
32         if (check()) flag=1;
33         return;
34     }
35     if (flag) return;
36     int i,nowx,nowy;
37     for (i=0;i<8;++i)
38     {
39         nowx=x+dx[i];nowy=y+dy[i];
40         if ((nowx<1)||(nowy<1)||(nowx>5)||(nowy>5)) continue;
41         swap(s[x][y],s[nowx][nowy]);
42         if (f(g)) dfs (nowx,nowy,g+1);
43         swap(s[nowx][nowy],s[x][y]);
44     }
45 }
46 int main()
47 {
48     int i,j,t,x,y;
49     scanf("%d\n",&t);
50     while (t>0){t--;
51         for (i=1;i<=5;++i)
52         {
53             for (j=1;j<=5;++j)
54             {
55                 c=getchar();
56                 if (c=='*') s[i][j]=2,x=i,y=j;
57                 else s[i][j]=int(c-'0');                
58             }
59             scanf("\n");
60         } flag=0;
61         for (ans=1;ans<=15;++ans)
62         {
63             dfs(x,y,0);
64             if (flag) break;
65         }
66         if (flag) printf("%d\n",ans);
67         else printf("-1\n");
68     }
69     return 0;
70 }

 

转载于:https://www.cnblogs.com/abclzr/p/5042991.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值