生成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
- 生成n个元素的全排列 C实现
- 生成n个元素全排列的算法
- C#实现求n个元素的全排列
- n个元素的全排列算法
- 《求n个元素的全排列》
- n个整数全排列的递归实现(C++)
- n个元素全排列
- 递归实现n个元素全排列(2)
- Java实现从m个各不相同的元素中取出n个,并进行全排列。
- Java实现从m个各不相同的元素中取出n个,并进行全排列
- 递归求n个元素的全排列
- 运用递归求n个元素的全排列
- Java N个元素全排列
- 递归生成n个元素的所有排列方式
- 递归算法生成n个元素的所有排列
- 一个包含M个元素的集合N个位置的全排列算法(附C代码)
- n个数全排列的非递归生成算法,C实现
- 8.n个字符的全排列(递归实现)
- hdu 1849 (尼姆博弈)
- 游戏评测(随笔)
- ASCII码排序
- Codeforces Round #306 (Div. 2) A B C
- UILabel基础语法
- 生成n个元素的全排列 C实现
- UITableView基础语法
- gdb调试多线程
- 基于邻接表的图建立(有向图+无向图)
- xcode的使用技巧索引
- 不配置环境变量运行tomcat
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- C# WPF Win7 标题栏添加按钮(模拟)
- UITextField基础语法