全排列-遞迴去重複實現-非DFS
阿新 • • 發佈:2018-11-09
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++){ //先保持不變,遞迴的棧的特點是最後開闢的棧先執行完畢,因此該遞迴執行的出的全排列具有一定順序 if(IsSwap(k,i,num)){ //用於去重複,重複的排列主要是由重複的字元進行交換組成的,當發現字元在前面已經出現過時,不進行交換 Swap(k,i,num); Pailie(num,k+1); Swap(k,i,num); } } } } //判斷是否與後面重複 public static boolean IsSwap(int start,int end,int num[]) { while(start<end){ if(num[start]==num[end]){ return false; } start++; } return true; } //交換函式 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(); } }