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*