#include <iostream>
using namespace std;
int count = 0;
#define MAX 4
void swap( char *a, char *b){
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
/**
* (全排列:A(m,n)且m==n)
* 全排列是这样的:第一个位置有n种方法,第二个位置n-1种方法...
* 从第一个位置开始,循环将每一个后面的值都交换到第一个位置来,
* 每次放好第一个位置之后,递归求解接下来后面的序列的全排列。
* 每次递归用k来指明正在放的是哪个位置。
*
* 每次递归的时候,剩下的元素里面,每个元素都有机会放在第一个位置(交换)。
*/
void permutation(char a[], int n, int begin){
if(begin == n){
//递归结束,输出当前排列好的序列
for(int i=0;i<n;i++)
cout<<a[i];
cout<<" ";
count++;
}
else{
//注意从位置k开始
for(int i=begin;i<n;i++){
swap(&a[begin], &a[i]);
permutation(a, n, begin+1); //递归求解位置begin+1开始的全排列
swap(&a[begin], &a[i]); //还原
}
}
}
/**
* (可重复的全排列)
* 第一个位置有n中方法,第二个位置有n中方法,...第n个位置有n中方法
* 重新声明一个同样大小的数组来存放结果,每次递归用k来指明正在放的
* 是哪个位置。
*/
void permutation_2(char a[], char b[], int begin, int n){
//n个位置全部放置完成,输出
if(begin == n){
for(int i=0;i<n;i++)
cout<<b[i];
cout<<"("<<count<<") ";
count++;
}
else{
//在第k个位置尝试放置每一个a[i]
for(int i=0;i<n;i++){
b[begin] = a[i];
permutation_2(a,b,begin+1,n); //递归处理第begin+1个位置
}
}
}
int number = 0;
void sub_set2(char a[], int n, char b[], int begin, int k){
if(k == 0){
//放置完成,输出
for(int i=0;i<begin;i++)
cout<<b[i];
cout<<"("<<number++<< ") ";
return;
}
//在位置begin尝试每一个a[i]
for(int i=0;i<n;i++){
b[begin] = a[i];
sub_set2(a, n, b, begin+1, k-1); //递归下一个位置
}
}
/**
* {a,b,c,d}: 子排列,A(1,n),A(2,n)...A(n,n) 并且可重复
* 即a,b,c,d, aa,ab,ac,ad,ba,bb,bc,bd, aaa,aab ,aac,aad,aba, abb...
*/
void permutation_3(char a[]){
char b[MAX];
count = 0;
for(int i=1;i<=MAX;i++)
sub_set2(a, MAX, b, 0, i);
}
int main(){
char a[MAX] = {'a' ,'b' ,'c' ,'d' };
char b[MAX];
cout<<"\n=== 全排列 ===" <<endl;
permutation(a, MAX, 0);
cout<<"count:" <<count<<endl;
cout<<"\n=== 可重复的全排列 ===" <<endl;
count = 0;
permutation_2(a, b, 0, MAX);
cout<<"count:" <<count<<endl ;
cout<<"\n=== 子全排列 ===" <<endl;
permutation_3(a);
return 0;
}
分享到:
相关推荐
在这里,我们讨论的是排列组合的一个实践练习,使用递归算法输出排列的所有序列。递归算法是一种经典的算法设计方法,它通过将问题分解成更小的子问题,逐步解决问题的方式来解决问题。 在排列组合中,递归算法可以...
在C/C++编程中,对数据进行排序并输出排列名次是一个常见的任务,特别是在处理考试成绩、比赛排名等场景。本篇文章将详细讲解如何在不打乱原始记录次序的情况下,实现这一功能。 首先,我们需要理解什么是“不打乱...
python输出排列组合sc
当`begin`等于`end`时,意味着所有位置都已被填充,此时调用`prints`函数输出排列。否则,遍历`begin`到`end`的所有元素,与`begin`位置的元素交换,然后递归处理剩余位置,最后再恢复原始状态,即交换回刚才交换的...
// 输出排列 } d[a[k]] = 0; // 恢复状态,准备下一次尝试 } } ``` 此方法是核心部分,通过递归的方式尝试所有可能的排列组合。 #### 5. 输出方法 `output()` ```java private void output() { System.out....
最后一行输出排列的总数。 #### 示例 - **输入样例**: ``` 4 aacc ``` - **输出样例**: ``` aacc acac acca caac caca ccaa 6 ``` #### 问题解析与算法设计 ##### 问题背景 本问题属于排列组合的一...
- **输出**:按照题目要求输出所有不同的排列,并在最后一行输出排列的总数。 #### 样例分析 对于样例输入 `4` 和字符串 `aacc`,程序应该输出所有不同的排列情况,共有 6 种不同的排列方式,分别是: - `aacc` - ...
// 输出排列 Console.WriteLine(string.Join(",", elements)); } } ``` 以上就是关于"C#排列组合类"的主要知识点,通过理解和掌握这些内容,开发者能够有效地在C#项目中实现排列组合功能,解决各种实际问题。
// 输出排列结果 for(j=1; j; j++) printf("%d", num[j]); printf("\n"); } } ``` - 如果当前位置 `i` 小于 `N`,则进行以下操作: - 从当前位置 `i` 开始循环到 `N`: - 保存当前元素到临时变量 `tmp`。 ...
之后,调用`Perm`函数生成所有排列,并输出排列总数。需要注意的是,为了保证程序的健壮性,实际应用中必须对用户输入进行验证,确保输入数据的合法性和正确性。 针对有重复元素的排列问题,除了上述基于回溯法的...
如果是,输出排列并返回。 3. 选择待填充位置列表中的一个元素,填入当前排列的下一个空位。 4. 将填充的元素从待填充位置列表中移除。 5. 如果还有待填充的位置,回到步骤2;否则,回溯到上一步,选择不同的元素...
- 调用 `Perm` 函数生成所有不重复的排列,并输出排列总数。 6. **性能分析**: - 该算法的时间复杂度取决于输入数组的长度 `n` 和其中不同元素的数量。最坏情况下,时间复杂度接近 O(n!)。 - 空间复杂度主要由...
该算法用来实现组合排列,并输出排列个数和排列结果!
% 输出排列 return; end for i = 1:length(remaining) if ~ismember(remaining(i), used) % 选择元素并标记为已使用 used = [used remaining(i)]; perm = [perm remaining(i)]; % 继续回溯搜索 ...
此外,输出排列结果时,可以采用打印数组的方式,或者将结果写入文件,以便进一步分析和比较。 通过解决“排列硬币”这样的问题,初学者不仅可以掌握C语言的基本语法,还能加深对数组、循环和条件判断的理解,同时...
if (n == 1) { // 输出排列 for (int i = stack->top; i >= 0; i--) { printf("%d ", stack->data[i]); } printf("\n"); } else { for (int i = start; i ; i++) { if (!isUsed[i]) { isUsed[i] = 1; ...
6. **输出结果**:在递归函数的非递归路径上,收集并输出排列或组合的结果。这通常涉及到数组或列表的处理,以及适当的输出语句。 这个“递归法取排列组合易语言源码例程”应该包含了上述步骤的具体实现。通过阅读...
【问题描述】 ...在标准输出上输出有若干行,每一行都是符合题意的一种排列形式,每个元素间用一个空格分隔,并按升序排列。 【输入样例】 3 2 【输出样例】 1 2 1 3 2 1 2 3 3 1 3 2