回溯算法其实就是暴力穷举算法,只不过暴力穷举采用了先拆解子问题,然后将子问题使用递归的方式进行求解,并且在不满足条件的情况下,有向上回溯的过程。

许多复杂的,规模较大的问题都可以使用回溯法。

回溯问题看起来比较复杂,但一般都有固定的套路。

据我个人的理解,回溯过程中需要明确以下几个问题

1.什么是合法的解

2.什么时候退出递归

3.什么时候需要回溯

下面我们使用经典的N皇后问题,来解读回溯算法的一般思路。

案例1:

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

 

 

现在我们来依次解决前面提出的三个问题

1.什么是N皇后问题合法的解

其实题意中已经非常明确,n皇后放在nxn的棋盘山,要求同一行、同一列、同一斜线都只能有一个皇后。

我们是按照每行一个皇后开始放置的,每一行肯定不会重复,我们只需要校验每一列、每一个45度斜线、每一个135度斜线没有重复的皇后即可。

我们定义三个set来判断列和两个斜线上的皇后数

  //
private Set<Integer> columnSet = new HashSet<>();
    //45度上升对角线
private Set<Integer> diagonalSet1 = new HashSet<>();
    //135度下降对角线
private Set<Integer> diagonalSet2 = new HashSet<>();

 

原文地址:http://www.cnblogs.com/wangbin2188/p/16848520.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性