全排列問題(遞歸調用)

全排列問題之遞歸調用(C語言)

題目以下:數組

給一個數字n,求1到n之間的數字的全排列。markdown

Input:spa

多組輸入,以EOF結束
1<=n<=8code

Output:blog

對於每一個n,輸出1到n的全排列
按字典序輸出全排列
每一個排列一行
相鄰兩個數字之間隔一個空格遞歸

Sample Input:io

3class

Sample Output:循環

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1語言

思路以下:
每一組解都填在數組中,cur表示當前狀態,cur == n爲遞歸邊界,每遞歸一次都在數組中填一個數,利用1~n的循環能夠用字典序排列。

代碼:

 1 #include<stdio.h>
 2 
 3 void print_permutation(int a[], int n, int cur){
 4     int i, j;
 5     if (cur == n){//遞歸邊界
 6         for (i = 0; i < n; i++) printf("%d ", a[i]);
 7         printf("\n");
 8     }
 9     else for (i = 1; i <= n; i++){ //從1開始向A[cur]中填各類整數i
10         int flag = 1;
11         for (j = 0; j < cur; j++)
12             if (a[j] == i) flag = 0; //若是i曾在數組a[0] ~ a[cur-1]以前出現過,則不選
13         if (flag){
14             a[cur] = i;
15             print_permutation(a, n, cur+1);//遞歸調用進入下一層
16         }
17     }
18 }
19 
20 int main()
21 {
22     int n;
23     int a[10];
24     while(scanf("%d", &n) != EOF){
25         print_permutation(a, n, 0);
26     }
27 
28     return 0;
29 }

 

PS: 該題的理解對於初學者來講難度不小,建議在紙上手算模擬。

相關文章
相關標籤/搜索