搜索格式这样写

困扰我好久的迭代搜索该怎么开始结束

\(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]);
    }
}
posted @ 2020-12-02 17:46  skkyk  阅读(360)  评论(0编辑  收藏  举报