`
airu
  • 浏览: 270779 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

全排列递归思路(c)版本

 
阅读更多

附上 c 版本

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 10

char * subElement(char *input,int pos);
void permutation(char *input,int len, int pos, char *p);

char *subElement(char *input, int pos)
{
    int i = 0;
    char *ret = (char*)malloc(MAX*sizeof(char));
    char *tmp = ret;
    while( input != NULL && i < MAX )
    {
        if(i != pos)
        {
            *tmp = *input;
            tmp++;
        }
        input++;
        i++;
    }
    tmp[i] = '\0';
    return ret;
}
void permutation(char *input, int len, int pos, char *p)
{
    int i = 0;

    if(len == 0)
    {
        return;
    }
    //only one element
    if(len == 1)
    {
            printf("{%s}\n",input);
            return;
    }

    char *lp = (char *)malloc(sizeof(char)*MAX);
    memset(lp,'\0',sizeof(char)*MAX);

    char *sp = subElement(input, pos);
    int plen = 0;
    if(p != NULL)
    {
        plen = strlen(p);
        strcpy(lp,p);
    }

    lp[plen] = input[pos];
    lp[plen+1] = '\0';

    int slen = strlen(sp);
    if(slen == 1)
    {
        lp[plen+1] = *sp;
        printf("{%s}\n",lp);
        return;
    }

    for(i = 0; i < slen; i++)
    {
        permutation(sp,len-1,i,lp);
    }
    free(sp);
    free(lp);
}
void main()
{
    int i = 0;
    char instr[MAX];
    printf("write elements:");
    scanf("%s",instr);
    char *parent = NULL;
    for(i = 0; i < strlen(instr); i++)
    {
        permutation(instr,strlen(instr), i, parent);
    }
}

 

关于这类问题的一个数学解释,很强大。

http://episte.math.ntu.edu.tw/articles/mm/mm_10_2_04/index.html

留下链接慢慢学习。

分享到:
评论

相关推荐

    使用C语言解决字符串全排列问题

    例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上...

    C语言实现的全排列算法

    在本例中,我们讨论的是使用C语言实现的全排列算法,主要关注递归方法。 在C语言中,全排列的实现通常基于回溯法。回溯法是一种试探性的解决问题的方法,它尝试分步地构造解决方案,并在每一步选择时,如果发现当前...

    PHP实现字符串的全排列详解

    例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 思路: 1.利用递归形成递归树,达到深度优先,固定首字母的效果 2.得复位以后才能再次深度优先 3.回溯法思想 4.一张图和...

    全排列算法实现(java\c#\c++,各种主流语言版本)

    这些实现遵循了基本的全排列算法思路,即通过递归和回溯来生成所有可能的排列。对于大型数据集,递归可能会导致栈溢出问题,因此有时会考虑非递归的迭代方法,如回溯搜索或者使用堆栈来存储中间状态,以提高效率。在...

    全排列算法

    C++中实现全排列的基本思路是:对于给定的序列,我们首先选择一个元素作为当前排列的第一个元素,然后对剩下的元素进行全排列。这个过程可以使用递归来实现。以下是一个基本的C++代码示例: ```cpp #include #...

    C语言实现全排列算法模板的方法

    在本文中,我们将通过示例代码介绍C语言实现全排列算法模板的方法,着重强调递归思路和 Swap 函数的实现细节。读者可以通过学习本文,掌握全排列算法的实现过程,并应用于实际项目中。 1. 什么是全排列算法? ...

    C语言入门-leetcode练习之第46题全排列.zip

    在本资源包"C语言入门-leetcode练习之第46题全排列.zip"中,主要涵盖了C语言的基础知识以及如何利用C语言解决算法问题的实践,特别是针对LeetCode平台上的第46题——全排列(Permutations)的解题方法。全排列问题是...

    qpl.rar_CC_全排列_输入全排列

    通过这个C++源代码,学习者可以理解如何运用递归和回溯法解决全排列问题,这对于理解和掌握算法设计思路,尤其是面对复杂问题的求解策略,具有很大的帮助。同时,这也是编程实践中提升问题解决能力的一个典型实例。

    Python字符串的全排列算法实例详解

    根据以上思路,我们可以编写如下的Python代码来实现字符串的全排列功能: ```python class Solution: def permutation(self, ss): # 定义递归函数 def recurPermutation(ss, index): result = [] if index == ...

    C语言原程序二十四点游戏的编程思路与基本算法.txt

    ### C语言原程序二十四点游戏的编程思路与基本算法 #### 一、二十四点游戏简介 二十四点游戏是一种数学益智游戏,玩家需要利用给定的四张牌(每张牌上的数字范围一般为1至13),通过加、减、乘、除四种运算(可以...

    深入全排列算法及其实现方法

    全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路。 给定一个具有n个元素的集合(n&gt;=1),要求输出这个集合中元素的所有可能的排列。一、递归实现...

    quanpailie.rar_visual c

    以下是一种常见的基于回溯的全排列实现思路: 1. **初始化**:首先,我们需要一个数组或容器来存储待排列的数字,并设定一个标志数组,用于记录每个数字是否已经出现在当前排列中。 2. **回溯**:从第一个位置开始...

    leetcode 46. Permutations 迭代+递归 python3

    LeetCode第46题的解决方案展示了如何使用递归和迭代生成全排列。虽然递归方法更加直观,但由于可能的重复计算,其空间效率较低。迭代方法虽然实现相对复杂,但能有效地减少不必要的计算,提高空间效率。在实际编程中...

    fullarray.c

    该算法实现全排列的思路是:设一列相邻且从小到大排列的数为a1,a2......an,从an-1向前倒推,依次比较该数与其后面数ak的大小,如果该数大,则将该数与ak交换位置,将ak后面的数重新从小到大排列,然后输出整个数列...

    cpp代码-dfs "ABC"全排列

    全排列问题的基本思路是:对于给定的字符集{'A', 'B', 'C'},我们需要找出所有可能的排列组合。由于有三个字符,所以总共有3! = 6种排列方式。在C++中,我们可以使用递归的方式实现DFS算法来解决这个问题。 首先,...

    基于C实现的按照字典序生成排列的算法(字典序)

    在C语言中,我们通常使用递归的方式来解决全排列问题。以下是一个基于深度优先搜索(DFS)的字典序排列生成算法的基本思路: 1. 为每个元素创建一个标记数组,用于记录当前元素是否已被使用过。 2. 定义一个递归...

    2011年c语言大赛模拟题

    - **解题思路**:采用递归的方式,对字符串的每一个字符进行交换,生成所有可能的排列。递归结束的条件是当前层级的字符串长度等于总的字符串长度,此时输出当前字符串即可。 - **示例代码**: ```c void f(char ...

    2011国信蓝点杯c语言试题

    这是一个典型的递归问题,可以用斐波那契序列的思路解决。如果m或n为0,则返回1,否则返回`f(m-1, n) + f(m, n-1)`。所以,缺失的代码是 `return f(m-1, n) + f(m, n-1);`。 5. **数组排序**: 题目5是重新排列数...

    南邮ACM算法与数据结构设计第5讲PPT教案学习.pptx

    在ACM竞赛中,高效的算法设计是取得成功的关键,而枚举法作为一种直接的解决方法,尽管简单但往往能为程序员提供思路。 **枚举法**是一种基础的算法设计思想,它要求设计者列出所有可能的解决方案,并逐一检查以...

Global site tag (gtag.js) - Google Analytics