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

近期在准备复习算法设计的考试,下边记录一些,看笔记时突然想到的解法。

问题是这种

用递归实现 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);
}
时间: 2024-08-01 22:37:00

生成n个元素的全排列 C实现的相关文章

使用 Zend_Form_Element 生成表单元素 --(手册)

表单由元素组成,它一般对应于 HTML 表单输入.Zend_Form_Element 封装了单个表单元素,并完成下列工作: 校验(提交的数据有效乎?) 抓取校验错误代码和消息 过滤(在校验和/或输出之前元素如何转义或规范化?) 解析(元素如何显示?) 元数据和属性(什么信息进一步修饰元素?) 基础类 Zend_Form_Element 对许多类有合理的缺省设置,但最好还是继承这个类来完成特殊意图的元素.另外,Zend Framework 带有许多标准的 XHTML 元素. 1.  插件加载器 Z

减治求有重复元素的全排列

求n个元素的全排列的所有解可以用减治法:每次拎出一个数做前缀,对剩下的元素再求全排列,直至只剩一个元素.代码源自<算法分析与设计(王晓东)>,复杂度O(n2) 1 //输出k~m的所有全排列 2 void perm(int k,int m) 3 { 4 if(k==m) 5 { 6 for(int i=0;i<=m;i++) 7 printf("%d ", list[i]); 8 printf("\n"); 9 }else 10 { 11 for(

Iphone上对于动态生成的html元素绑定点击事件$(document).click()失效解决办法

在Iphone上,新生成的DOM元素不支持$(document).click的绑定方法,该怎么办呢? 百度了N久都没找到解决办法,在快要走投无路之时,试了试Google,我去,还真找到了,歪国人就是牛逼,原帖地址:http://stackoverflow.com/questions/3705937/document-click-not-working-correctly-on-iphone-jquery 大概意思是,如果要用$(document).click()来绑定新生成的DOM元素,必须给此

九章算法面试题54 带重复元素的全排列

九章算法官网-原文网址 http://www.jiuzhang.com/problem/54/ 题目 给定一个带重复元素的整数集合,求出这个集合中所有元素的全排列.对于集合[1,1,2],其本质不同的全排列有三个,分别为: [1,1,2] [1,2,1] [2,1,1] 在线测试本题 http://lintcode.com/problem/unique-permutations/ 解答 首先做这个题目之前,要先会不带重复元素的全排列. 程序参考:http://www.ninechapter.co

n个元素的全排列

1 //求n个元素的全排列 2 //abc acb bac bca cab cba 3 4 public class FullPermutation { 5 6 public static void f(char[] data,int k) 7 {//k表示当前的交换位置(关注点),与其后的元素交换 8 9 if(k==data.length){//此处写length和length-1都可以,前者会溢出但是不会有影响,后者效率更高一点 10 for(int i=0;i<data.length;i

Concise and clear CodeForces - 991F(dfs 有重复元素的全排列)

就是有重复元素的全排列 #include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long LL; const int maxn = 10010, INF = 0x7fffffff; char str[maxn]; int vis[maxn], v[maxn]; LL num[maxn]; LL res = 0; void init() { num[0

poj3421 X-factor Chains(重复元素的全排列)

poj3421 X-factor Chains 题意:给定正整数$x(x<=2^{20})$,求$x$的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的子序列的个数. 显然最大长度就是$x$的质因数个数(一个一个加上去鸭) 而满足最大长度的子序列个数.... 这不就是可重复元素的全排列吗! 有这么一个公式,设元素总个数$n$,每个重复元素的个数$m_{i}$,共$k$种不同元素 则全排列个数$=\frac{n!}{\prod_{i=1}^{k}m_{i}!}$ 发现$n

通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置

zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我将介绍如何实现使用该插件生成HTML元素Dom树,并对其进行多样操作. 先贴上一个简单的HTML页面(直接拿的ztree的用的,画面简单实用,里面的文字内容不用在意) 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-e

有重复元素的全排列

问题: 有k个元素,其中第i个元素有ni个,求全排列个数 分析: 令所有ni之和为n,设答案为x 首先做全排列, 然后把所有元素编号 其中第s中元素编号为1~ns 由于编号后所有元素均不相同,方案总数为n的全排列数n! n1!n2!n3!...nk!x=n! 移项即可 原文地址:https://www.cnblogs.com/darlingroot/p/10388821.html