算法——回溯方法

一、回溯方法

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

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

二、透过问题分析算法

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

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

 

  

  

  

posted @ 2017-03-25 20:15  YRLeaner  阅读(320)  评论(0编辑  收藏  举报