IDA*就是迭代加深和A*估价的结合
在迭代加深的过程中,用估计函数剪枝优化
并以比较优秀的顺序进行扩展,保证最早搜到最优解
需要空间比较小,有时跑得比A*还要快
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int num,cnt,x,y; int zx[5]={0,-1,0,1,0},zy[5]={0,0,-1,0,1};//1上,2左,3下,4右 int c[4][4]; inline void read() { char cc; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) { cc=getchar(); c[i][j]=cc-'0'; if(c[i][j]==0){ x=i; y=j; } } } int de[9][2]={{2,2},{1,1},{1,2},{1,3},{2,3},{3,3},{3,2},{3,1},{2,1}}; //de[i][0/1]表示数字i在目标状态的横、纵坐标 inline int close() //笛卡尔距离之和 { int mark=0; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) mark+=abs(i-de[c[i][j]][0])+abs(j-de[c[i][j]][1]); return mark>>1; } inline void dfs(int t,int pre) { // cout<<t<<endl; // for(int i=1;i<=3;i++) // { // for(int j=1;j<=3;j++) // printf("%d ",c[i][j]); // puts(""); // } // puts(""); int clo=close(); if(clo==0){ printf("%d ",t); exit(0); } if(t+clo>cnt) return; for(register int i=1;i<=4;i++) if(((i+1)%4+1)!=pre) //若i与pre不互逆 ,便扩展 { x+=zx[i];y+=zy[i]; if(1<=x&&x<=3&&1<=y&&y<=3) { swap(c[x][y],c[x-zx[i]][y-zy[i]]); dfs(t+1,i); swap(c[x][y],c[x-zx[i]][y-zy[i]]); } x-=zx[i];y-=zy[i]; } } int main() { read(); for(cnt=1;cnt<=200000;cnt++) dfs(0,0); return 0; } // 加上 register 160ms
// 不加 register 108ms
// 开O2 40ms