一、回溯法 的基本概念
回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,还满足所有其他要求时,则继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,并继续试探的过程成为向前试探。
“回溯法 ”一词在wiki百科 中的定义如下:
回溯法 (英语:backtracking )是穷尽搜索 算法(英语:Brute-force search)中的一种。
回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法 来实现,在反复重复上述的步骤后可能出现两种情况:
- 找到一个可能存在的正确的答案
- 在尝试了所有可能的分步方法后宣告该问题没有答案
在最坏的情况下,回溯法会导致一次复杂度 为指数时间的计算。
另外,回溯法 在百度词条 中的定义:点击这里
二, 简单实例
例题一:在象棋算式里,不同棋子代表不同的数,有如图一所示的算法,设计一个算法求这些棋子各代表哪些数字。
方法一:回溯法
解:用多重循环来试探各棋子不同的取值情况,逐一地判断它们是否满足图一种列出的条件;为了避免同一数字被重复使用,可设立逻辑数组x,x[i](0<=i<=9)值为1时表示数i没有被使用。例如对于棋子兵,先试探它的取值a,让x[a]=0表示其他棋子不能再取值a,继续其他棋子的试探,当不成功(放弃当前候选解)或输出一个解(找到一个解)后进行回溯,让x[a]=1表示其他棋子可以取值a,即再试探其他候选解。对应的算法如下:
C++实现如下:
兵:5炮:2马:4卒:0车:1
请按任意键继续. . .
三,更多 实例(持续更新 )