所谓深度优先遍历,把问题想象成层次问题,每一层都有几个选项可供选择。
我们按深度优先遍历,就是只要当前选项还有可能对,就相信它是对的,往下一层次进发,如果到了某一层证明当前选择不可行,则选择该层其它选项,如果该层无其它选项可选,即该层所有选项都不可选,则说明问题出在上一层,则回溯到上一层重复“选择其它选项,若无其它选项继续回溯”的操作。
深度优先遍历的控制方法就像上面提到的那样:
在某一层,如果这一层没有被证明不可行,那么递归调用下一层,将所有工作都交给下一层,如果下一层可以成功解决整个问题(当然下一层可能还要递归再下一层),则返回TRUE,从而使调用可以层层以TRUE递归回溯,如果下一层不能解决这个问题,则尝试本层其它选项,如果本层如其它选项,则返回FALSE,表示当前策略错误,关于此FALSE如何被处理,由调用本层的上一层决定(尝试其它选项或返回FALSE)。
POJ 1683
就是典型的DFS,今天上午写的时候迷迷糊糊,乱七八糟,下午还是参考了别人的代码写了出来,没白参考,算是总结了一些关于DFS的特点和做法,都写在上面了。
其实这些书本上都写了,但是实际编程的时候就想不起来,只有亲自想通这些,才能总结好记住。如果能把上述思想都实现了,那就肯定完成了DFS咯。
代码如下: