bzoj1085 [SCOI2005]骑士精神

题目链接

暴力DFS当然不行

于是迭代加深吧。IDA*

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

 

posted @ 2016-01-22 15:53  HugeGun  阅读(118)  评论(0编辑  收藏