附上 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
留下链接慢慢学习。
相关推荐
例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上...
在本例中,我们讨论的是使用C语言实现的全排列算法,主要关注递归方法。 在C语言中,全排列的实现通常基于回溯法。回溯法是一种试探性的解决问题的方法,它尝试分步地构造解决方案,并在每一步选择时,如果发现当前...
例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 思路: 1.利用递归形成递归树,达到深度优先,固定首字母的效果 2.得复位以后才能再次深度优先 3.回溯法思想 4.一张图和...
这些实现遵循了基本的全排列算法思路,即通过递归和回溯来生成所有可能的排列。对于大型数据集,递归可能会导致栈溢出问题,因此有时会考虑非递归的迭代方法,如回溯搜索或者使用堆栈来存储中间状态,以提高效率。在...
C++中实现全排列的基本思路是:对于给定的序列,我们首先选择一个元素作为当前排列的第一个元素,然后对剩下的元素进行全排列。这个过程可以使用递归来实现。以下是一个基本的C++代码示例: ```cpp #include #...
在本文中,我们将通过示例代码介绍C语言实现全排列算法模板的方法,着重强调递归思路和 Swap 函数的实现细节。读者可以通过学习本文,掌握全排列算法的实现过程,并应用于实际项目中。 1. 什么是全排列算法? ...
在本资源包"C语言入门-leetcode练习之第46题全排列.zip"中,主要涵盖了C语言的基础知识以及如何利用C语言解决算法问题的实践,特别是针对LeetCode平台上的第46题——全排列(Permutations)的解题方法。全排列问题是...
通过这个C++源代码,学习者可以理解如何运用递归和回溯法解决全排列问题,这对于理解和掌握算法设计思路,尤其是面对复杂问题的求解策略,具有很大的帮助。同时,这也是编程实践中提升问题解决能力的一个典型实例。
根据以上思路,我们可以编写如下的Python代码来实现字符串的全排列功能: ```python class Solution: def permutation(self, ss): # 定义递归函数 def recurPermutation(ss, index): result = [] if index == ...
### C语言原程序二十四点游戏的编程思路与基本算法 #### 一、二十四点游戏简介 二十四点游戏是一种数学益智游戏,玩家需要利用给定的四张牌(每张牌上的数字范围一般为1至13),通过加、减、乘、除四种运算(可以...
全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路。 给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。一、递归实现...
以下是一种常见的基于回溯的全排列实现思路: 1. **初始化**:首先,我们需要一个数组或容器来存储待排列的数字,并设定一个标志数组,用于记录每个数字是否已经出现在当前排列中。 2. **回溯**:从第一个位置开始...
LeetCode第46题的解决方案展示了如何使用递归和迭代生成全排列。虽然递归方法更加直观,但由于可能的重复计算,其空间效率较低。迭代方法虽然实现相对复杂,但能有效地减少不必要的计算,提高空间效率。在实际编程中...
该算法实现全排列的思路是:设一列相邻且从小到大排列的数为a1,a2......an,从an-1向前倒推,依次比较该数与其后面数ak的大小,如果该数大,则将该数与ak交换位置,将ak后面的数重新从小到大排列,然后输出整个数列...
全排列问题的基本思路是:对于给定的字符集{'A', 'B', 'C'},我们需要找出所有可能的排列组合。由于有三个字符,所以总共有3! = 6种排列方式。在C++中,我们可以使用递归的方式实现DFS算法来解决这个问题。 首先,...
在C语言中,我们通常使用递归的方式来解决全排列问题。以下是一个基于深度优先搜索(DFS)的字典序排列生成算法的基本思路: 1. 为每个元素创建一个标记数组,用于记录当前元素是否已被使用过。 2. 定义一个递归...
- **解题思路**:采用递归的方式,对字符串的每一个字符进行交换,生成所有可能的排列。递归结束的条件是当前层级的字符串长度等于总的字符串长度,此时输出当前字符串即可。 - **示例代码**: ```c void f(char ...
这是一个典型的递归问题,可以用斐波那契序列的思路解决。如果m或n为0,则返回1,否则返回`f(m-1, n) + f(m, n-1)`。所以,缺失的代码是 `return f(m-1, n) + f(m, n-1);`。 5. **数组排序**: 题目5是重新排列数...
在ACM竞赛中,高效的算法设计是取得成功的关键,而枚举法作为一种直接的解决方法,尽管简单但往往能为程序员提供思路。 **枚举法**是一种基础的算法设计思想,它要求设计者列出所有可能的解决方案,并逐一检查以...