My ZOJ solutions
递归回溯 + 剪枝。
递归出口:k = N * N + 1
每次递归使用 check()
判断是否要剪枝。
- 注意从二维数组第 k 个元素转换到行号列号的技巧
int r = k / N + 1;
int c = k % N + 1;
- 注意 debug 时使用
print_map()
- 注意回溯法的初始化
DFS + stack。
设置原字符串下标 src_ptr 和目标字符串下标 tgt_ptr。
每次 DFS 递归时,作如下判断:
- 若 src_ptr 已达到原串末尾,且 tgt_ptr 已达到原串末尾,且栈内没有剩余元素,说明该序列已达到了一个可行解。
- 若栈不为空,且栈顶元素等于 tgt_ptr 所指的字符,则又有两种选择:将当前栈顶弹栈,tgt_ptr++,或将当前 src_ptr 所指元素入栈。(tgt_ptr < len,src_ptr < len)
- 若以上两条都不满足,则将 src_ptr 所指元素入栈。(src_ptr < len)
模拟。
倒水问题。用一个杯子装满,不断倒入另一个容积更大的杯子,容积更大的杯子装满时,则清空大杯子,如此循环,必会达到某个体积。
编码/译码。
数学计算。
公式变形和确定计算到的最大 k 的过程如下:
模拟。
图形学。求线段交点,求平面多边形所围成的面积。