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\) 次操作才能到达目标局面。然后迭代加深搜索即可。

浙公网安备 33010602011771号