木棒拼接,POJ上的1011
题目:http://poj.org/problem?id=1011
经典的搜索+剪枝问题。这题我已经做第三遍了,感觉依旧很晕。说一下,自己对搜索的感觉。以前写搜索算法,总会不自觉的用到栈。比如,迷宫问题,通过压栈保存路径,通过弹栈进行回退。还要设置个标志,保证“不走来时路”。
看了大牛们写的code后,有种醍醐灌顶的感觉:递归形式的写法真简洁!因为这种写法把压栈弹栈的工具交给了complier, 所以代码显得格外清爽。但是,玫瑰虽香,身上带刺。清爽简洁并不代表简单易写。这是,函数的参数、返回值都要反复斟酌。要不断的问自己:函数需要几个参数、有没有返回值、递归终止条件是什么。
针对本题,拼接的过程是一个DFS,即:不断拿木棒尝试,拼好一个再拼下一个。需要知道的参数:当前拼接已获得的木棒长度、已经拼接成功的木棒数、当前正在尝试的木棒编号。拼接的过程需要判断,所以函数返回bool.
在用栈实现时,回退就是不断的弹栈。这里,回退就比较隐晦,只是把已经设置的标记再复原一下。而且,递归调用时也很抽象。只有像binary tree上写递归一样,假设递归调用的部分结果已知,然后才能继续写后面的代码。
本题的另一个关键在剪枝,可以用于剪枝的条件: