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();
}
}