清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
用递归实现 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); }