算法分析与设计-有重复元素的排列问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计实验报告题目:有重复元素的排列问题
年月日
一、实验题目
有重复元素的排列问题
二、实验目的
问题描述:设R={r1,r2,...,rn}是要进行排列的n个元素。

其中元素r1,r2,...,rn可能相同。

试设计一个算法,列出R的所有不同排列。

三、实验内容
算法设计:给定n及待排列的n个元素。

计算出这n个元素的所有不同排列。

数据输入:由文件input.txt提供输入数据。

文件的第1行是元素个数n,1<=n<=500。

接下来的1行是待排列的n个元素。

结果输出:将计算出的n个元素的所有不同排列输出到文件output.txt。

文件最后1行中的数是排列总数。

输入文件示例输出文件示例
input.txt output.txt
4 aacc
aacc acac
acca
caac
caca
ccaa
6
四、实验原理
1)aacc四个元素的全排列,我们可以划分为3个元素的全排列,3个划分为2个,到最后只剩下1个元素,就不需要排列。

2)让每一个元素作为打头元素,交换,然后进行递归,再交换。

3)如果该打头元素在前面中已经有过,则忽略这种情况。

五、实验步骤
1)实现环境:Microsoft Visual Studio 2010
2)编写代码,在程序文件夹下建立input.txt,output.txt,输入问题,运行,发现错误不断调试
3)实验代码:
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
char a[1000];
char b[1000];
int main() {
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n;
scanf("%d",&n);
scanf("%s",&a);
sort(a,a+n);
for(int i=0;i<n;i++)
{
b[n-i-1]=a[i];
}
for(int i=0;i<n;i++)
{
printf("%c",b[i]);
}
printf("\n");
int t=1;
while(strcmp(a,b))
{
t++;
for(int i=0;i<n;i++)
{
printf("%c",a[i]);
}
printf("\n");
next_permutation(a,a+n);
} for(int i=0;i<n;i++) {
printf("%c",b[i]);
}
printf("\n");
printf("%d",t);
return 0;
}
六、实验结果分析
运行结果截图:。

相关文档
最新文档