算法——回溯方法

一、回溯方法

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

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

二、透过问题分析算法

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

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

 

  

  

  

转载于:https://www.cnblogs.com/yrstudy/p/6596769.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值