大一的時候沒有好好學,后來都是要還的QAQ
大三重修了C語言(刷分)。再次遇到了全排列這道題,之前是直接抄的書上的代碼,沒有認真理解意思。在大二學習中也知道了全排列是依靠遞歸實現的,索性這次就沒有參考文章,自己寫了一個全排列出來。(代碼運行效率看起來還可以)
核心思想是遞歸地交換兩個數字。for循環意味着對level-1之后的數字遍歷交換一次。
因為交換了數字,所以在遞歸出口的時候要把之前的交換還原。(想象整個過程,而不是細節就會明白)
寫出來也挺簡單的,十幾分鍾的事情orz,還是大一太佛了,沒有認真學習,否則現在也不會這么艱難啊QAQ。
不說了不說了,最后附上代碼:
輸入:一個數字n,代表hash數組中的前幾位參與全排列。
輸出:數字的全排列,以從小到大的順序排列,共$A^n_n$個
#include <stdio.h> int hash[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; int loc; void print() { int i; for(i = 0; i < loc; i++) printf("%d ", hash[i]); printf("\n"); return; } void swap(int src, int dst) { int temp; temp = hash[src]; hash[src] = hash[dst]; hash[dst] = temp; } void sort(int level) { int i; if(level == loc){ print(); return; } sort(level + 1); for(i = 0; i+level < loc; i++){ swap(level + i, level - 1); sort(level + 1); } for(i = loc - level - 1; i>= 0;i--) swap(level+i, level - 1); } int main() { scanf("%d", &loc); sort(1); return 0; }