題目描述
輸入一個數組,以空格隔開,要求按一下順序輸出其全排列。
樣例:
輸入:
1 2 3
輸出:
123 132 213 231 312 321
備註:輸入和輸出都是自然數數組。
程序設計
毫無疑問,這道題我首先想到的是運用遞歸來解決。
對於輸入的一個數組n,其排列方式可看作是在n個位置,從第一個位置開始,到最後一個位置,放置所輸入的n個數。
假設我們先將輸入的n個數放在一個箱子裏。
對第 step (0 ≤ step <n)個位置,我們可以選擇除了前面 step 個數以外的 step - i 個數中的一個(即箱子裏剩下的下一個(按輸入順序))來放置。
當 step = n 時,說明n個位置均已放置好對應的數,作爲一種排列方式輸出。
這時,再返回上一層遞歸,返回之後要將剛剛放置在n - 1這個位置的數,放回箱子裏。
即step = n - 1時,即最後一個位置,箱子裏只有一個數可以放,同理再返回上一層遞歸。
返回之後要將剛剛放置在n - 2的位置的數放回箱子裏。
即step = n - 2時,即倒數第二個位置,箱子裏只有兩個數可以放…
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static int n = 0;
public static int[] array;
public static int[] array2;//裝數字的箱子
public static boolean[] array3;//記錄箱子中對應的數字是否已經被取出
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num;
ArrayList<Integer> arrayList = new ArrayList<>();
while(scanner.hasNext()){
num = scanner.nextInt();
arrayList.add(num);
n++;
}
int i=0;
array = new int[n];
array2 = new int[n];
array3 = new boolean[n];
for ( Integer each:arrayList) {
array[i++] = each;
}
for (int j = 0; j < n; j++) {
array3[j] = true;
}
fullPermutation(0);
}
public static void fullPermutation(int step){
if (step == n)
{
for (int j = 0; j < n; j++) {
System.out.print(array2[j]);
}
System.out.print(" ");
return;
}
for (int i = 0; i < n; i++) {
if (array3[i]){
array2[step] = array[i];
array3[i] = false;//該數已從箱子裏取出
fullPermutation(step + 1);
array3[i] = true;//放回該數至箱子
}
}
return;
}
}
遞歸的思路,我用語言描述起來比較繞,大家可以將提供的樣例,代入到程序跑一遍,便會有更清晰的認識。