输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
算法思路:
假设往n个空位上填数字,从第一位开始填,将每个数字都填到空位上,填补时不能与之前填过的数一样,当填满时,将搜索树的叶子结点输出。
Java代码:
import java.util.Scanner;
public class Main {
static int []arr;
static boolean []vis;
static int n;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
arr = new int[n + 1];
vis = new boolean[n + 1];
scan.close();
dfs(1);
}
public static void dfs(int step) { // step表示当前填到第几个空位了
if(step > n) { // 通过step填满时判断叶子节点
for(int i = 1; i <= n; i++) System.out.print(arr[i] + " ");
System.out.println();
return;
}
for(int i = 1; i <= n; i++) {
if(!vis[i]) {
arr[step] = i;
vis[i] = true;
dfs(step + 1);
vis[i] = false; // 回溯
}
}
}
}