zoukankan      html  css  js  c++  java
  • 算法——回溯方法

    一、回溯方法

      回溯方法通常用在:从一个指定集合中选择一个对象序列,使该序列满足某一标准。

      所谓回溯,我们将问题构建成一个树,在确定一个节点只会引向死胡同时,我们回退到该节点的父节点,在下一个节点继续查找。

    二、透过问题分析算法

      n皇后问题

      n皇后问题是指我们在nxn的棋盘上放置n个皇后,使任何两个皇后之间不相互威胁。即他们不在同一行、同一列,同一对角线。

      我们以4皇后来做假设。4*4*4*4 = 256种答案。

      假设一个a[5][5]的棋盘

        一个空父节点

      1、a[1][1]有希望,以它为下一点的父节点

      2、a[2][1]同一行,无希望。

         a[2][2]同一对角线,无希望

         a[2][3]有希望,以它为下一个的父节点。

      3、a[3][1]同一行无希望

         a[3][2]同一对角线,无希望

         a[3][3]同一行,无希望

         a[3][4]无希望,所有子节点都不可以,回退到a[1][1].

      4、回退到a[1][1]

         a[2][4]有希望。

      5、。。。。。

      继续下去可以得到结果。

      伪代码如下

     1   void expand(node v){
     2       node u;
     3       for(v中的每个子节点){
     4         if(promings(u)){
     5            if(在u处有一个答案)
     6               写出该答案
     7            else
     8              expand(u)
     9         }
    10       }
    11     }

      promings(u)判断u点是否有希望。即在这里面判断是否存在皇后会威胁到其他皇后。

    总结:回溯算法的思想便是,将问题先构建成一个空间树,从一个父节点引向若干子节点,当某条路径没有希望时,舍去该节点,回溯到该节点的父节点,在遍历父节点的其他子节点,直至找到答案。

      

      

      

  • 相关阅读:
    postgres 常见错误之字段关联不明确
    nginx proxy_pass 配置
    css font-family有哪些
    Inno Setup [Run] Section 双引号嵌套
    ubuntu16.04下ftp服务器的安装与配置
    How to check if directory exist using C++ and winAPI
    Ubuntu parted 命令 写在脚本里时要带 -s 参数
    Ubuntu syslog 太多的 named[1195]: error (network unreachable) resolving './DNSKEY/IN': 2001:7fd::1#53
    Ubuntu忘记超级用户root密码,重新设置密码 转载
    Python 替换文本中的某些词语
  • 原文地址:https://www.cnblogs.com/yrstudy/p/6596769.html
Copyright © 2011-2022 走看看