生成n个元素的全排列 C实现

来源:互联网 发布:围巾淘宝加盟 编辑:程序博客网 时间:2024/05/29 04:18

最近在准备复习算法设计的考试,下边记录一些,看笔记时突然想到的解法。
问题是这样的
用递归实现 n 个元素的全排列。

当时老师给出的解答是 假定第i个元素 ri 放在首位,于是 f(r1,r2,…,rn) = f(ri U {r1, r2,….,rn}) = U (ri & f(r1,r2, …, rn)), 当时应该是听懂了,不过现在看到这个笔记,又醉了。 (这货居然是我上课记的笔记 。。。。。。。。)

后来自己仔细想想,其实很简单的 一个问题, 利用回溯法,把问题看成是一个排列树,可以很容易的解决。
下面放出原码, 这是用C实现的, 实在是懒得用C++了。

// =====================【全排列 】==================// @ author         :           zhyh2010// @ date           :           20150606// @ version        :           1.0// @ description    :       // =====================【全排列】==================#include <stdio.h>#include <stdlib.h>#define NUM 4char 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);}
0 0