回溯算法(2)
回溯算法(2)
网格型
难以画出递归搜索树,类似于生活中的走格子。
单词搜索
问题描述:
这类问题多出一个找出起点的过程,找到了递归的起点,再从起点进去上下左右的移动即可,这里可以通过修改原网格中的字符实现标记已经走过这里了,然后递归后修改回来实现(悔棋)。
N皇后
问题描述:
明确一点:每行每列至多同时至少只有一个皇后,抽屉原理
那么用一个数组记录皇后位置:colum[i] = j
表示第 i 行的皇后在第 j 列,这样就相当于求皇后的全排列剪枝剪掉对角线上出现多个皇后的情况
具体实现:从每行开始枚举,利用标志位标识该列是否已经存放皇后,该格子对应的对角线上是否已经存放格子。如果允许放皇后的条件(该列没有,对角线上没有)则递归下一行,递归后撤回标志位的修改实现回溯(想象为悔棋)。
小结:至此回溯篇告一段落,接下来我将通过分析对比自己的代码,和大佬写的优雅的代码来进行总结学习
总结
- 一定要搞清楚递归中dfs(i)i 的含义,搞清楚i的含义后代码逻辑就会很清晰。
- 剪枝的目的:减少递归次数,提前返回