解法一
/**
* 列出集合S={a1,a2,~,an}的所有全排列
* @author JH
*
*/
public class two {
private static int count=0;
private static int n;
private static int[] list;
public static void pailie(int i) {
if(i >= n) {
output();
return;
}
for(int j = i+1; j < n; j++) {
if(!same(i,j))
continue;
swap(i, j);
pailie(i+1);
swap(i, j);
}
pailie(i+1);
}
public static boolean same(int i, int j){
for (int k = i; k < j; k++) {
if(list[j]==list[k]){
return false;
}
}
return true;
}
public static void swap(int i, int j) {
list[i] ^= list[j];
list[j] ^= list[i];
list[i] ^= list[j];
}
public static void output(){
count++;
for(int i = 0;i < n;i++) {
System.out.print(list[i]+" ");
}
System.out.println();
}
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("输入集合内节点数量N");
n = s.nextInt();
list = new int[n];
System.out.print("输入集合内的"+n+"个数");
for(int i = 0;i < n;i++) {
list[i] = s.nextInt();
}
pailie(0);
System.out.println("一共"+count+"种全排列");
}
}
解法二
public class aa {
private static int k;
private static int count =0;
public static void init(int[] list) {
List<Integer> tmp = new ArrayList<Integer>();
zuhe(0, tmp, list);
}
private static void zuhe(int curIdx, List<Integer>tmp, int[] list) {
if (curIdx<= list.length&&tmp.size()==k) {
System.out.println(tmp);
count++;
}
for (int i = curIdx; i<list.length; i++) {
tmp.add(list[i]);
zuhe(i + 1, tmp, list);
tmp.remove(tmp.size() - 1);
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("输入非负整数N");
int n = s.nextInt();
int list[] = new int[n];
for (int i = 0; i< n; i++) {
list[i] = i+1;
}
System.out.print("输入子集整数个数");
k = s.nextInt();
init(list);
System.out.println(count+"种组合");
}
}