用递归实现 n 个元素的全排列。
当时老师给出的解答是 假定第i个元素 ri 放在首位,于是 f(r1,r2,…,rn) = f(ri U {r1, r2,….,rn}) = U (ri & f(r1,r2, …, rn)), 当时应该是听懂了,不过现在看到这个笔记,又醉了。 (这货居然是我上课记的笔记 。。。。。。。。)
后来自己仔细想想,其实很简单的 一个问题, 利用回溯法,把问题看成是一个排列树,可以很容易的解决。
下面放出原码, 这是用C实现的, 实在是懒得用C++了。
// =====================【全排列】==================
#include
#include
#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);
}
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。