把迭代加深理解错了 自己写了半天也没写对
所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是由于搜索的复杂度是呈指数级别增加的,所以对于下一层搜索,前面的工作可以忽略不计,因而不会导致时间上的亏空。
IDA*就是一个加了层数限制depth的DFS,超过了限制就不在搜索下去,如果在当前层数没有搜到目标状态,就加大层数限制depth,这里还只是一个IDA算法,并不是A*的。当然我们可以用A*的估计函数去剪枝,如果当前深度d+h()>depth的时候就可以不再搜索下去了,这样就是IDA*了。
具体 代码里有注释
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 int a[25]; 8 int p[8] = {6,7,8,11,12,15,16,17};//中间8个所对应的序号 9 int rev[8] = {5,4,7,6,1,0,3,2};//A-F B-E...反着移动 10 int v,ans[110]; 11 int po[8][7] = {0,2,6,11,15,20,22, 12 1,3,8,12,17,21,23, 13 10,9,8,7,6,5,4, 14 19,18,17,16,15,14,13, 15 23,21,17,12,8,3,1, 16 22,20,15,11,6,2,0, 17 13,14,15,16,17,18,19, 18 4,5,6,7,8,9,10};//8种操作的原始顺序 对应ABCDEFGH 19 void change(int k)//操作一次的结果 20 { 21 int i,y = a[po[k][0]]; 22 for(i = 0 ; i < 6 ; i++) 23 a[po[k][i]] = a[po[k][i+1]]; 24 a[po[k][6]] = y; 25 } 26 int fdep()//这个是简单的估计下还需要搜得层数 假如中间已经有5个相同的了 那最少还要移3次 27 { 28 int i,x[4] = {0,0,0,0}; 29 for(i = 0 ; i < 8 ; i++) 30 x[a[p[i]]]++; 31 int an=0; 32 for(i = 1 ; i < 4 ; i++) 33 an = max(an,x[i]); 34 return 8-an; 35 } 36 int dfs(int depth) 37 { 38 int i,tt; 39 for(i = 0 ; i < 8 ; i++) 40 { 41 change(i);//操作 42 tt = fdep(); 43 if(tt==0)//已经到达目的解 44 { 45 ans[depth] = i; 46 return 1; 47 } 48 if(depth+tt<v)//如果没有超过层数限制 49 { 50 ans[depth] = i; 51 if(dfs(depth+1)) 52 return 1; 53 } 54 change(rev[i]);//撤销操作 55 } 56 return 0; 57 } 58 int main() 59 { 60 int i; 61 while(scanf("%d",&a[0])&&a[0]) 62 { 63 for(i = 1 ; i < 24 ; i++) 64 scanf("%d",&a[i]); 65 if(fdep()==0) 66 { 67 puts("No moves needed"); 68 printf("%d\n",a[17]);//这里不要忘了输出 69 continue; 70 } 71 v = 1; 72 while(!dfs(0)) 73 { 74 v++; 75 } 76 for(i = 0 ; i < v ; i++) 77 printf("%c",ans[i]+'A'); 78 puts(""); 79 printf("%d\n",a[15]); 80 } 81 return 0; 82 }