回溯
Backtracking(回溯)属于DFS。
- 普通的DFS主要用在可达性问题,这种问题只需要执行到特定的位置然后返回即可。
- 而Backtracking主要用于求解排列组合问题,例如有{'a','b','c'}三个字符,求解所有由这三个字符排列得到的字符,这种问题在执行到特定位置返回之后还会继续执行求解过程。
因为Backtracking不是立即返回,而是要继续求解,因此在程序实现时,需要注意对元素的标记问题:
- 在访问一个新元素进入新的递归调用时,需要将新的元素标记为已经访问,这样才能在继续递归调用时不用重复访问该元素。
- 但是在递归返回时,需要将元素标记为未访问,因为只需要保证一个递归链中不同时访问一个元素,可以访问已经访问过但是不在当前递归链中的元素。