新手入门dfs/回溯
前言
本题选用ABC全排列问题,方便大家更容易理解dfs回溯过程
记录个人对算法的总结的理解,如有错误请大佬指出,
提示:以下是本篇文章正文内容,下面案例可供参考
一、dfs,回溯模板?
个人看过诸多关于dfs,回溯视频以及其他优质博客
都主要围绕两点,1:何时停止搜索,2:遍历剩下节点,
二、使用步骤
废话不多说上代码,可以仔细理解文章注释,建议先画出它的树状结构图,便以理解代码
2.读入数据
代码如下(示例):
import java.util.*;
public class ABC {
public static void main(String[] args) {
//res1负责存储最终结果
List<Stack<Character>>res1=new ArrayList<>();
//使用栈集合,先进后出原则
Stack<Character> res = new Stack<>();
char[]a={'A','B','C'};
System.out.println(permute(a));
}
public static List<List<Character>> permute(char[]nums){
List<List<Character>>res1=new ArrayList<>();
Stack<Character> res = new Stack<>();
int len= nums.length;
boolean[]pb=new boolean[len]; ///判断次数
dfs(nums, pb, 0, res,res1); //进行dfs
return res1;
}
//pb判断当前元素是否使用
public static void dfs(char[]nums, boolean[]pb, int index, Stack<Character> res, List<List<Character>> res1){
//截至条件
if(index==nums.length){
res1.add(new ArrayList<>(res)); //只要层级达到字符数字长度就将路径添加到res1中
return; //return单个使用,为终止方法
}
//遍历候选节点
for (int i = 0; i < nums.length; i++) {
char c = nums[i];
if (!pb[i]) { //判断当前元素是否使用的条件,boolean默认为false
res.push(c); //把没有使用的元素添加到栈集合里面
pb[i] = true; //因为使用了这个元素所以给他设置为true,
dfs(nums, pb, index + 1, res,res1); //此处+1是为了进入下一层,如果想深入理解的伙伴可以在回溯前后打印当前元素值
res.pop(); //恢复状态,将前一个元素删除,
pb[i] = false; //删除了就证明没有被使用了
}
}
}
}
---
# 本人创建新手交流群,群内基本小白,可以使大家没有压力问问题,并配备一位大佬,群内拥有丰富学习路线资源,大家可以共同进步,欢迎前来交流983528891