一、输出N个数的无重复全排列
Input:
输入一个数值N(1<=N=50)
Output:
输出N个数的无重复全排列,每个数之间用空格隔开
最后一行输出无重复全排列的个数。
Sample Input:
3
Sample Output:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Total=6
Hint
剪枝时,用标记法(哈希查表)判重,加快判重速度
二、思路
1.用整型数组a存放路径
2.用整数ans存放结果的个数
3.用布尔数组vis来表示数字的使用情况,false代表未被使用
4.采用深度优先搜索,dfs回溯函数
5.从路径的第一位开始,确定一个数字(比如i,令vis[i]=true),然后用未被使用的数字(比如j,满足vis[j]==false)确定第二位,依次类推。。。。直到确定完n位,输出,ans++(多一种结果情况)
三、代码:
package _DFS算法;
import java.util.*;
public class _无重复全排列 {
private static int [] a; //存放结果
private static int ans = 0; //统计结果的个数
private static boolean [] vis; //标识:数字i是否被使用
private static int n;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
a = new int [n+1];
vis = new boolean[n+1];
dfs(1); //从第一个数字开始确定
System.out.print("Total="+ans);
scan.close();
}
private static void dfs(int k) {//确定第k个数字的取值
// TODO Auto-generated method stub
if(k>n) {//边界结束条件--------------------------(1)
print(a);
ans ++;
return;
}
for(int i=1;i<=n;i++) {
if(!vis[i]) {
vis[i] = true;
a[k] = i;
dfs(k+1);
vis[i] = false;//回溯-----------------------(2)
a[k] = 0;
}
}
}
private static void print(int[] a) {
// TODO Auto-generated method stub
for(int i=1;i<=n;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
}