近期在准备复习算法设计的考试,下边记录一些,看笔记时突然想到的解法。
问题是这种
用递归实现 n 个元素的全排列。
当时老师给出的解答是 假定第i个元素 ri 放在首位,于是 f(r1,r2,…,rn) = f(ri U {r1, r2,….,rn}) = U (ri & f(r1,r2, …, rn)), 当时应该是听懂了,只是如今看到这个笔记。又醉了。
(这货竟然是我上课记的笔记 。。。。
。
。。
。)
后来自己细致想想,事实上非常简单的 一个问题, 利用回溯法,把问题看成是一个排列树。能够非常easy的解决。
以下放出原码。 这是用C实现的, 实在是懒得用C++了。
// =====================【全排列 】==================
// @ author : zhyh2010
// @ date : 20150606
// @ version : 1.0
// @ description :
// =====================【全排列】==================
#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);
}