1.题目:给定一个数字n,求它的全排列
如n=3,则它的全排列组合方式有如下所示:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
2.思路:通过深度优先搜索来做,用一个数组来标记当前位置,一个数组来记录当前位置所代表的的值,只要未标记就加入排列数组中,当数组中元素达到n时,输出这个排列,并取消对应位置的标记
3.代码如下所示:
public class Main {
public static void dfs(int pos,boolean flag[],int nums[]){//nums数组记录排列的数组,
if (pos>=nums.length){//若当前数组元素个数超过n,输出数组中元素
for (int i = 0; i <nums.length ; i++) {
System.out.print(nums[i]+" ");
}
System.out.println();
}
else {//若还未排列完毕,继续添加元素
for (int i = 0; i <nums.length ; i++) {
if (!flag[i]){//若当前位置还未被添加到数组中,访问这个位置对应的元素
nums[pos]=i+1;//添加数字到当前排列中去
flag[i]=true;//标记此位置,代表这个位置的元素已被添加
dfs(pos+1,flag,nums);//继续添加其余位置的元素
flag[i]=false;//一趟排列采集到后,释放此标记位置,让其余排列能访问到此位置
}
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
boolean flag[]=new boolean[n];
int nums[]=new int[n];
dfs(0,flag,nums);
}
}
4.结果如下所示: