C實現生成n個元素的全排列
用遞歸實現 n 個元素的全排列。
當時老師給出的解答是 假定第i個元素 ri 放在首位,于是 f(r1,r2,…,rn) = f(ri U {r1, r2,….,rn}) = U (ri & f(r1,r2, …, rn)), 當時應該是聽懂了,不過現在看到這個筆記,又醉了。 (這貨居然是我上課記的筆記 。。。。。。。。)
后來自己仔細想想,其實很簡單的 一個問題, 利用回溯法,把問題看成是一個排列樹,可以很容易的解決。
下面放出原碼, 這是用C實現的, 實在是懶得用C++了。
// =====================【全排列】==================include <stdio.h>
include <stdlib.h>
define NUM 4
char arr[NUM] = { 0 };
int m_solution_num = 0;
void init() { for (int i = 0; i != NUM; i++) { arr[i] = 'A' + i; } }
void output() { printf("第%d組解為:\n", ++m_solution_num); for (int i = 0; i != NUM; i++) { printf("%c\t", arr[i]); } printf("\n"); }
void swap(char a, char b) { char aa = a; char bb = b;
aa = aa ^ bb; bb = aa ^ bb; aa = aa ^ bb; *a = aa; *b = bb;
}
void solve(int curpos) { if (curpos >= NUM) { output(); return; }
// 原來寫的是0, 這里應該是curpos for (int i = curpos; i != NUM; i++) { swap(&arr[curpos], &arr[i]); solve(++i); --i; swap(&arr[curpos], &arr[i]); }
}
void main() { init(); solve(0); }</pre>
本文由用戶 puye 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!