AcWing 842. 排列数字
【题目描述】
【思路】
DFS中的经典例题
dfs(int m, String res)
res记录遍历的一条路径,到达叶子结点时也就是m == n是,就是一个排列。
vis标记数组标记该条路径中1 ~ n用过的数字,因为每一个数字只能使用一次。
要注意现场的恢复。因为第一次完成深搜后,所有元素都已经被访问过了。如果没有进行恢复现场这样在回溯到上一层时,上层的现场中的状态都被下层更改了,数据就会乱套。
`java
import java.util.Scanner;
public class Main{
static int N = 10;
static int n;
static boolean vis[] = new boolean[N];
public static void dfs(int m, String res){
if(m == n){
System.out.println(res);
return;
}
for(int i = 1; i <= n; i ++)
{
if( !vis[i]){
vis[i] = true;
dfs(m + 1, res + i + " ");
vis[i] = false;
}
}
}
public static void main(String args[]){
Scanner reader = new Scanner(System.in);
n = reader.nextInt();
dfs(0, "");
}
}