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 }