我将DFS的题目归结为几个注意点。
第一就是要注意边界和结束条件,边界就是不符合条件的,比如数组的越界等等。结束条件就是什么时候已经成功了,也就是达到题意了。
第二就是剪枝,剪枝就意味着要对走过的点和改变的数据做处理。
第三就是回溯,有的题目一定要回溯,但是有的题目不用回溯,选择不回溯反而是优化算法的关键。
第四就是注意遍历的顺序,比如每一步有几种选法,再比如每一步有几种方向。
经典例题分析:
① 全排列问题 https://ac.nowcoder.com/acm/problem/15128
此题较易,注意点就是剪枝加回溯。
② N皇后问题 https://ac.nowcoder.com/acm/problem/235813
此题的关键体现在遍历的顺序,可以一个一个格子的遍历,每一个格子有两种可能,放或者是不放,如果数据少还好,但是如果数据一大就不行了。
第二种遍历方式是每一行有且仅有一个皇后,因此就可以转换为对每一行的遍历。
此题还有一个关键就是正对角线和反对角线的表示,正对角线和反对角线的斜率分别都是相等的,就看y=kx+b中的b了,然后如果b小于0,就可以加一个偏移量,避免下标为负数的。
③ 马踏棋盘 https://ac.nowcoder.com/acm/problem/235814
这个题不要被题意误导,因为在坐标系下(x,y)对应的是(j,i)
④ 数独挑战 https://ac.nowcoder.com/acm/problem/24911
此题较易
⑤ 幸运数字 https://ac.nowcoder.com/acm/problem/15291
此题需注意数据是很大的因此可以先将所有的幸运数字构造出来,然后再用巧妙的方法来计算,
而不是用暴力的方法来算哦。然后在线段的处理的时候要小心,特别要注意在同一区间内。
⑥奶酪 https://ac.nowcoder.com/acm/problem/16417
此题不用回溯,因为此点到不了终点就是到不了终点,就不用再考虑了。
⑦wyh的迷宫 https://ac.nowcoder.com/acm/problem/15434
此题不用回溯,因为此路不通,则无论怎样此路都是不通的哦。
⑧Lake Counting https://ac.nowcoder.com/acm/problem/24739
dfs也不回溯
此题可以用dfs亦可以用bfs来做,就是求连通分支的个数呗。