zoukankan      html  css  js  c++  java
  • 搜索格式这样写

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

    (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]);
        }
    }
  • 相关阅读:
    阿里云遇到的坑:CentOS7防火墙(Firewalld),你关了吗?
    阿里云学生机——Mysql配置---教小白入门篇
    关于Javac编译器的那点事(一)
    B树,B+树,B*树简介
    ArrayList动态扩容机制
    满二叉树和完全二叉树
    nginx实践(二)之静态资源web服务(浏览器缓存场景)
    http之cdn介绍
    http之理解304
    nginx实践(一)之静态资源web服务
  • 原文地址:https://www.cnblogs.com/skkyk/p/14075240.html
Copyright © 2011-2022 走看看