列印全排列
阿新 • • 發佈:2020-10-28
//第一次嘗試:
#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,intn) { 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上的一位大佬)