带剪枝操作的dfs(用于寻找所有解集)
1.递归出口(满足最后条件跳出递归)
2.站在此节点,遍历所有可能的选择(理解成解集树,比如在一个矩阵里,从某一个节点出发,有上下左右四种选择。一般用for循环遍历,将总问题分解成一个个相同的子问题)
3.回溯的核心。体现在如何剪枝
①最常见的就是在进行下一步递归前执行list.add(),最后在return之前执行list.remove(),从而实现回溯。
②不走回头路。定义vis数组,记录当前节点是否被访问过。同样也是需要在return之前进行回撤(恢复原来状态的操作)
仔细体会下面链接里剪枝的艺术