IDA*与A*

A* 与 IDA* 都是设计一个乐观估价函数,用于判断当前情况能否得到解,乐观估价函数的值总是小于或对于实际所需的操作数,可以减少不必要的搜索。

IDA* 除了乐观估价函数外,还有使用了迭代加深搜索。

[SCOI2005] 骑士精神:IDA*解决,设当前局面与目标局面的差异为 \(x\),显然我们最少要用 \(x-1\) 次操作才能到达目标局面。然后迭代加深搜索即可。

inline int diff(){
    int cnt=0;
    for(int i=0;i<5;i++)for(int j=0;j<5;j++)
        if(a[i][j]!=Aim[i][j]) cnt++;
    return max(cnt-1,0);
}
inline bool IDA(int x,int y,int dep,int d){
    int cur=diff();
    if(cur==0)return true;
    if(dep+cur>d)return false;
    for(int i=0;i<8;i++){
        int nx=x+dx[i],ny=y+dy[i];
        if(nx<0||ny<0||nx>4||ny>4)continue;
        swap(a[x][y],a[nx][ny]);
        if(IDA(nx,ny,dep+1,d))return true;
        swap(a[x][y],a[nx][ny]);
    }
    return false;
}

UVa1343 旋转游戏:只考虑某一个数字时,我们可以视其为 1,其它为 0。然后就是进行有限次操作到达目标局面,设当前局面与目标局面的差异为 \(x\),显然我们最少要用 \(\lceil\frac{x}{2}\rceil\) 次操作才能到达目标局面。然后迭代加深搜索即可。

posted @ 2025-06-16 17:27  fzrcy  阅读(21)  评论(0)    收藏  举报