1. 程式人生 > 實用技巧 >列印全排列

列印全排列

//第一次嘗試:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//在被交換的元素前面序列中,如果出現了這個元素,那麼就不必交換了
int judge(int arr[],int i,int k) {
    for (; k < i; k++) {
        if (arr[k] == arr[i]) {
            return 0;
        }
    }
    return 1;
}

int StringRank(int arr[],int k,int
n) { if (k == n) { for (int i = 0; i <= n; i++) { printf("%d", arr[i]); } printf(" "); } else { for (int i = k; i <= n; i++) { if (judge(arr, i, k) == 1) { int t = 0; t = arr[i]; arr[i] = arr[k]; arr[k] = t; StringRank(arr, k
+ 1, n); t = arr[i]; arr[i] = arr[k]; arr[k] = t; } } } } int main() { /*char arr[10] = { 0 }; printf("輸入要輸入的字串個數:\n"); int n = 0; scanf("%d", &n); getchar(); printf("輸入一串字串:\n"); for (int i = 0; i < n; i++) { scanf("%c", &arr[i]); }
*/ /*for (int i = 0; i < n; i++) { printf("%c", arr[i]); }*/ int arr[] = { 1,2,3,3 }; StringRank(arr,0,3); return 0; }
//遞迴真的是太難了用了,這道題我想了一上午才搞明白,哈哈哈
//主要思想就是,假設有{1, 2, 3, ... n}這樣一個序列,現在要找出這個序列的全排列,第一位有 n 種可能性,確定了第一位後就是求解剩下 n - 1 個數據的排列問題
//這樣就可以往下一直分解問題,直到序列結尾處,也就是終止條件。
//本程式碼中,還處理了出現重複數字的情況下,保證不會重複輸出同一串序列。
//另外,本題借鑑了一位大佬的思想,否則可能要花更多的時間。--
jiaobuchong(CSDN上的一位大佬)