算法分析与设计-有重复元素的排列问题
- 格式:doc
- 大小:127.00 KB
- 文档页数:4
算法设计实验报告题目:有重复元素的排列问题
年月日
一、实验题目
有重复元素的排列问题
二、实验目的
问题描述:设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;
}
六、实验结果分析
运行结果截图:。