1.递归
package cn.edu.ccnu.cs;
import java.util.Scanner;
public class Arrangement_dfs {
int ans;
public int[] vis;
public int[] num;
public int[] a;
public void dfs(int x,int n){
if(x==n){
for(int i=0;i<n;i++){
System.out.print(num[i]+" ");
}
System.out.println();
this.ans++;
}else{
for(int i=0;i<n;i++){
if(this.vis[i]==0){
this.num[x]=this.a[i];
this.vis[i]=1;
dfs(x+1,n);
this.vis[i]=0;
}
}
}
return ;
}
public Arrangement_dfs(){
}
public Arrangement_dfs(int length){
this.vis=new int[length];
this.num=new int[length];
this.a=new int[length];
}
public static void main(String[] args) {
int n;
Scanner cin = new Scanner(System.in);
n=cin.nextInt();
Arrangement_dfs per=new Arrangement_dfs(n);
for(int i=0;i<n;i++){
per.a[i]=i+1;
}
per.ans=0;
per.dfs(0, n);
System.out.println(per.ans);
cin.close();
}
}
2.字典序法
package cn.edu.ccnu.cs;
import java.util.Scanner;
public class Arrange_main {
/**检查是否是最后一个序列*/
public static boolean Check(int[] num){
int n=num.length;
for(int i=0;i<n;i++){
if(num[i]!=n-i){
return true;
}
}
return false;
}
/**输出数组*/
public static void Print(int[] num){
for(int i=0;i<num.length;i++){
System.out.print(num[i]+" ");
}System.out.println();
}
/**字典序法 生成下一个排列*/
public static void nextPermutation(int[] num) {
if(num==null || num.length==0){
return;
}
int i=num.length-2;
while(i>=0 && num[i]>=num[i+1]){
i--;
}
if(i>=0){
int j=i+1;
while(j<num.length && num[j]>num[i]){
j++;
}
j--;
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
reverse(num,i+1);
Print(num);
}
public static void reverse(int[] num,int index){
int l=index;
int r=num.length-1;
while(l<r){
int temp=num[l];
num[l]=num[r];
num[r]=temp;
l++;
r--;
}
}
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
int n;
n=cin.nextInt();
int[] list=new int[n];
for(int i=0;i<n;i++){
list[i]=i+1;
}
long now;
now=System.currentTimeMillis();
long ans=0;
Print(list);
do{
ans++;
nextPermutation(list);
}while(Check(list));
System.out.println("number of arrangement is "+(ans+1)+" and time cast:"+(System.currentTimeMillis()-now));
cin.close();
}
}