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 }

 

posted @ 2015-11-05 21:53  WABoss  阅读(220)  评论(0编辑  收藏  举报