zoukankan      html  css  js  c++  java
  • 生成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组解为:
    ", ++m_solution_num);
        for (int i = 0; i != NUM; i++)
        {
            printf("%c	", arr[i]);
        }
        printf("
    ");
    }
    
    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);
    }
  • 相关阅读:
    矿Mac必备软件
    PHP第六课 使用方法数组
    I/O概述和审查操作
    应用程序配置文件
    他毕业两年,博客一年,时间
    苹果公司的回复
    CImage类的介绍与使用
    数据库移植遇到的问题
    MP算法和OMP算法及其思想
    ROR 环境的 搭建
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7236684.html
Copyright © 2011-2022 走看看