1. 程式人生 > >全排列-遞迴(不含去重複的操作)非DFS

全排列-遞迴(不含去重複的操作)非DFS

import java.util.*;
public class Quanpaifeidigui {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            int num[]=new int[n];
            for(int i=0;i<n;i++){
                num[i]=in.nextInt();
            }
            Pailie(num,0);   //全排列
        }
    }
    public static void Pailie(int num[],int k){
        if(k==num.length-1){
            Print(num);
        }else{
            for(int i=k;i<num.length;i++){ //先保持不變,遞迴的棧的特點是最後開闢的棧先執行完畢,因此該遞迴執行的出的全排列具有一定順序
                Swap(i,k,num);
                Pailie(num,k+1);
                Swap(i,k,num);
            }
        }
    }

    //交換函式
    public static void Swap(int x,int y,int num[]){
        int temp=num[x];
        num[x]=num[y];
        num[y]=temp;
    }
    //列印結果
    public static void Print(int num[]){
        for(int i=0;i<num.length;i++){
            if(i==0){
                System.out.print(num[i]);
            }else{
                System.out.print(" "+num[i]);
            }
        }
        System.out.println();
    }
}