标签:集合 影响 标准 code 个人 names end 动态添加 八皇后问题
引用一下维基百科对回溯法的介绍:
回溯法(英语:backtracking)是暴力搜索法中的一种。
对于某些计算问题而言,回溯法是一种可以找出所有(或一部分)解的一般性算法,尤其适用于约束满足问题(在解决约束满足问题时,我们逐步构造更多的候选解,并且在确定某一部分候选解不可能补全成正确解之后放弃继续搜索这个部分候选解本身及其可以拓展出的子候选解,转而测试其他的部分候选解)。
在经典的教科书中,八皇后问题展示了回溯法的用例。(八皇后问题是在标准国际象棋棋盘中寻找八个皇后的所有分布,使得没有一个皇后能攻击到另外一个。)
回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算。
之前并未试过利用回溯法编程解决问题,在看了《关于八皇后问题以及回溯递归思想》这篇博文后收获颇丰,在此感谢作者。我在其基础上给出了利用回溯法,使用C++编程解决n皇后问题的代码如下
通过以上n皇后问题回溯法的求解过程,个人认为类似的回溯法求解问题可以借鉴以上的几点编程技巧:
通过以上编程技巧的小结,我发现以前遇到的一道编程题可以通过这些技巧解决。(当时还未学过回溯法,不会写。)
题目:有一个自然数集合,其中最小的数是1,最大的数是100。这个集合中的数除了1之外,每个数都可由集合中的某两个数相加而得(这两个数可以相同)。利用回溯法编写程序,求符合上述条件的、元素个数为10的所有集合。
分析:由题意可知,这10个元素中必然包含1和100,所有的元素除了1都是另外两个数相加得到或是另一个数的两倍。我们不妨限定最后得到的10个数按升序排列(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10)。由于较大的数是由两个较小的数相加或一个较小的数的两倍,因此较大数的范围是[(1+max(集合)),(2*max(集合)),例如若已找到(x1,x2,x3),则x4的范围是[x3+1,2 * x3]。因此算法思路是输入一个拥有一个元素的集合,不断获取下一个较大的数,并判断是否满足题目条件,直到集合中共有9个元素为止,最后将100加入集合并判断是否满足题目条件,满足则结束递归并输出结果,否则回溯到上一步并将上一个元素加1再次进行判断,直到当前步骤所有元素均测试完毕。
文字分析可能没有讲得很清楚,看代码有助于理解,C++代码如下:
标签:集合 影响 标准 code 个人 names end 动态添加 八皇后问题
原文地址:https://www.cnblogs.com/xiepengzhi/p/10330778.html