搜索格式这样写
困扰我好久的迭代搜索该怎么开始结束
从\(step == 0\) 开始
到\(step == k\) 判断 是否合法结束
循环里边这么写
for(.... ) {
...........;//操作
dfs(step + 1);
...........;//回溯
}
也就是说先动在搜
\(step == 0\) 处理 第一次
\(step == 1\) 处理 第二次
\(step == k - 1\) 处理 第k次
\(step == k\) 处理 第k + 1次
但是 k + 1 就应该退出
关于估价函数什么的
直接记住下边的板子
test(int step) {
.....;
if(++cnt + step > k) return false;
.....;
}
dfs(int step) {
if(step == k) { if(check()); return ;}
for(....) {
....;//操作
if(test(step))
dfs(step + 1);
....;//回溯
}
}
比如说那个八数码难题
//niiick
char ss[15];
int ans[4][4]=
{{0,0,0,0},
{0,1,2,3},
{0,8,0,4},
{0,7,6,5}};
int a[5][5],k,judge;
int nxtx[]={0,1,-1,0};
int nxty[]={1,0,0,-1};
int check()
{
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
if(ans[i][j]!=a[i][j])return 0;
return 1;
}
int test(int step)
{
int cnt=0;
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
if(ans[i][j]!=a[i][j]){ if(++cnt+step>k) return 0;}
return 1;
}
void A_star(int step,int x,int y,int pre)
{
if(step==k){ if(check())judge=1; return;}//达到当前限制的最大深度
if(judge) return;
for(int i=0;i<4;++i)
{
int nx=x+nxtx[i],ny=y+nxty[i];
if(nx<1||nx>3||ny<1||ny>3||pre+i==3) continue;//加入了上述最优性剪枝
swap(a[x][y],a[nx][ny]);
if(test(step)&&!judge) A_star(step+1,nx,ny,i);//A*估价合法再向下搜索
swap(a[x][y],a[nx][ny]);
}
}
我就是我不一样的验货