bzoj 1085: [SCOI2005]骑士精神

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int b[5][5]={{1,1,1,1,1},
 5              {0,1,1,1,1},
 6              {0,0,2,1,1},
 7              {0,0,0,0,1},
 8              {0,0,0,0,0}};
 9 int xx[8]={1,1,-1,-1,2,2,-2,-2},yy[8]={2,-2,2,-2,1,-1,1,-1};
10 int a[5][5],T,x,y,kg,K;
11 bool A(int a[5][5],int k)
12 {
13     int sum=0;
14     for(int i=0;i<5;i++)
15       for(int j=0;j<5;j++)
16         if(a[i][j]!=b[i][j])
17           sum++;
18     return K>=sum+k;
19 }
20 bool pan(int a[5][5])
21 {
22     for(int i=0;i<5;i++)
23       for(int j=0;j<5;j++)
24         if(a[i][j]!=b[i][j])
25           return 0;
26     return 1;
27 }
28 void dfs(int k,int a[5][5],int x,int y)
29 {
30     if(k==K)
31       {
32         if(pan(a))
33           kg=1;
34         return;
35       }
36     if(kg)
37       return;
38     for(int i=0;i<8;i++)
39       {
40         int nx=x+xx[i],ny=y+yy[i];
41         if(nx<0||nx>4||ny<0||ny>4)
42           continue;
43         swap(a[nx][ny],a[x][y]);
44         if(A(a,k))
45           dfs(k+1,a,nx,ny);
46         swap(a[nx][ny],a[x][y]);
47       }
48     return;
49 }
50 char ch[10];
51 int main()
52 {
53     scanf("%d",&T);
54     for(;T;T--)
55       {
56         for(int i=0;i<5;i++)
57           {
58             scanf("%s",ch);
59             for(int j=0;j<5;j++)
60               if(ch[j]=='*')
61                 {
62                     a[i][j]=2;
63                     x=i;
64                     y=j;
65                 }
66               else a[i][j]=ch[j]-'0';
67           }
68         for(K=1;K<=15;K++)
69           {
70             dfs(0,a,x,y);
71             if(kg)
72               {
73                 printf("%d\n",K);
74                 break;
75               }
76           }
77         if(!kg)
78           printf("-1\n");
79         else
80           kg=0;
81       }
82     return 0;
83 }

普通的迭代深搜超时,可以用A*

你可能感兴趣的:(bzoj 1085: [SCOI2005]骑士精神)