| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
puye
10年前发布

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

用递归实现 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);  }