回溯问题是建立在递归的基础上的,并在解答树的基础上使用了DFS深度优先搜寻解答方案的策略,所以解答回溯问题的关键,在于寻找结束递归的边界条件,以及每一步测试当前方案是否符合题设条件。如果符合条件,进行递归向下,进行下一步的测试,否则继续试探,如果试探都结束,仍然找不到合理的解答,则推出现在所在的递归,及返回上一个递归栈帧,修改上一栈帧的值,重新测试,掌握回溯法,关键在于掌握试探的思想。
void dfs(int cur) //cur表示当前所在解答方案中的位置 { if(cur==解答方案完成的最后一步) { 从前到后完整输出临时数组解答方案; } else { for(i 全部取值) //使用遍历的思想,搜寻解答 { if(将i试探性的填入当前的解答方案,检查并不符合条件) { break; } else dfs(cur+1); //向下递归搜寻解答方案 } } }