C實現生成n個元素的全排列

puye 9年前發布 | 1K 次閱讀 C/C++

用遞歸實現 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!