BZOJ1085 [SCOI2005]骑士精神(IDA*)
IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法。
这题代码量挺少的,可以看出整个IDA*的框架:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 char init[5][6],over[5][6]={ 7 {"11111"}, 8 {"01111"}, 9 {"00*11"}, 10 {"00001"}, 11 {"00000"} 12 }; 13 14 int h(){ 15 int res=0; 16 for(int i=0; i<5; ++i){ 17 for(int j=0; j<5; ++j){ 18 if(over[i][j]!=init[i][j]) ++res; 19 } 20 } 21 return res; 22 } 23 24 int mxdep; 25 bool isok; 26 int dx[8]={-2,-2,-1,1,2,2,1,-1}; 27 int dy[8]={-1,1,2,2,1,-1,-2,-2}; 28 void dfs(int x,int y,int g){ 29 if(g==mxdep){ 30 if(!memcmp(init,over,sizeof(over))) isok=1; 31 return; 32 } 33 if(isok) return; 34 for(int i=0; i<8; ++i){ 35 int nx=x+dx[i],ny=y+dy[i]; 36 if(nx<0 || nx>=5 || ny<0 || ny>=5) continue; 37 swap(init[x][y],init[nx][ny]); 38 if(g+h()<=mxdep) dfs(nx,ny,g+1); 39 swap(init[x][y],init[nx][ny]); 40 } 41 } 42 43 int main(){ 44 int t; 45 scanf("%d",&t); 46 while(t--){ 47 int x,y; 48 for(int i=0; i<5; ++i){ 49 for(int j=0; j<5; ++j){ 50 scanf(" %c",&init[i][j]); 51 if(init[i][j]=='*') x=i,y=j; 52 } 53 } 54 for(mxdep=0,isok=0; mxdep<=15 && !isok; ++mxdep){ 55 dfs(x,y,0); 56 } 57 if(isok) printf("%d\n",mxdep-1); 58 else puts("-1"); 59 } 60 return 0; 61 }