新手必看,dfs深度优先遍历,java代码实现
目录
递归的思想
递归是函数中一个很重要的思想,要学着理解递归的本质原理,即函数中访问函数,加上一定的判断执行条件后进行回溯,最后达到执行的根本目的。
一、一维递归搜索 跳台阶问题
一个楼梯共有 n 级台阶,每次可以走一级或者两级,问从第 0 级台阶走到第 n级台阶一共有多少种方案。
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示方案数。
数据范围
1≤n≤15
输入样例:
5
输出样例:
8
import java.util.Scanner;
public class Main {
private static int dfs(int n) {
if(n==0) return 1;
int cnt = dfs(n-1);
if(n>=2) cnt+=dfs(n-2);
return cnt;
}
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.printf("%d\n",dfs(n));
}
}
二、二维递归搜索 走方格
给定一个 n×m 的方格阵,沿着方格的边线走,从左上角 (0,0) 开始,每次只能往右或者往下走一个单位距离,问走到右下角 (n,m) 一共有多少种不同的走法。
输入格式
共一行,包含两个整数 n和 m。
输出格式
共一行,包含一个整数,表示走法数量。
数据范围
1≤n,m≤10
输入样例:
2 3
输出样例:
10
import java.util.Scanner;
public class Main {
private static int dfs(int n,int m) {
//从终点走到起点和从起点走到终点方案数一样
if(n==0 && m==0) return 1;
if(n<0 || m<0) return 0;
int cnt = 0;
cnt = dfs(n-1,m) + dfs(n,m-1);
return cnt;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(),m = sc.nextInt();
System.out.printf("%d\n",dfs(n,m));
}
}
三、全排列方案输出
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤9
输入样例:
3
输出样例:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
import java.util.Scanner;
//大规模输出
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
//定义变量 path数组用于存储输出路径 st数组用于判断当前i是否被用过
public class Main {
private static int[] path;
private static boolean [] st;
private static int n;
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//u表示当前排列到哪一位了
private static void dfs(int u) throws Exception {
if(u==n) {
for(int i= 0;i<n;i++)
bw.write(path[i] + 1 +" ");
bw.write("\n");
}
else {
for(int i = 0;i<n;i++) {
//当前元素没被用过
if(!st[i]) {
st[i] = true;
path[u] = i;
dfs(u+1);
st[i] = false;
}
}
}
}
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
path = new int[n];
st = new boolean[n];
dfs(0);
bw.flush();
}
}