• 算法——回溯方法


    一、回溯方法

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

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

    二、透过问题分析算法

      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点是否有希望。即在这里面判断是否存在皇后会威胁到其他皇后。

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

      

      

      

  • 相关阅读:
    (转)linux书籍推荐
    (转)X Windows与GNOME,KDE的关系
    (转)学习Linux编程开发必读书籍
    (转)详解C中volatile关键字
    博客开张了
    VMware虚拟产品简介
    c++ eof()
    旋转矩阵
    VMware文件辨别
    Microsoft HTTPAPI/2.0 use Port 80 – 无法启动WAMP Apache
  • 原文地址:https://www.cnblogs.com/yrstudy/p/6596769.html
Copyright © 2020-2023  润新知