题目描述
输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 nn。
输出格式
组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个宽。
import java.util.Scanner;
public class Main {
static int n=0;
static int[] used=new int[100];
static int[] pd=new int[100]; //pd是判断是否用过这个数
//输出函数
public static void print() {
for(int i=1;i<=n;i++) {
System.out.print(" "+used[i]); //保留五位常宽
}
System.out.println();
}
//深搜函数,当前是第k格
public static void dfs(int k) {
if(k==n) {
print();
return;
}
for(int i=1;i<=n;i++) { //1-n循环填数
if(pd[i]!=1) { //如果当前数没有用过
pd[i]=1; //标记一下
used[k+1]=i; //把这个数填入数组
dfs(k+1); //填下一个
pd[i]=0; //回溯
}
}
}//return下一步回到这
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
dfs(0); //从第0格开始
}
}
疑点:if(k==n) {
print();
return;
}
当执行到k==n时,执行print()函数输出,然后return,
return是终止循环,然后往下执行for然后会发现i=1-3都
标记过了,所以他就会回到dfs的下一个语句就是pd[i]=0;
然后把之前标记的都回溯为0