有重复元素的排列问题
来源:互联网 发布:mac系统偏好设置卡死 编辑:程序博客网 时间:2024/05/17 21:38
问题描述
设R={ r1, r2, ……, rn }是要进行排列的n个元素。其中元素r1 ,r2 ,……,rn可能相同。试设计一个算法,列出R的所有不同排列。
算法设计
给定n以及待排列的n个元素。计算出这n个元素的所有不同排列。
数据输入
输入数据的的第1行是元素个数n,1≤n≤500。接下来的1行是待排列的n个元素。
数据输出
将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数。
输入样例
4 aacc
输出样例
aacc
acac
acca
caac
caca
ccaa
6
源代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std ;
long long ans;
int ok(char str[],int a ,int b )
{
if(b>a)
for(int i=a;i<b;i++)
if(str[i]==str[b])
return 0;
return 1;
}
void perm(FILE* fp,char str[],int k,int m)
{
int i;
if(k==m)
{
ans++;
for(i=0;i<=m;i++)
fprintf(fp,"%c",str[i]);
fprintf(fp,"\n");
return ;
}
else for(i=k;i<=m;i++)
if(ok(str,k,i))
{
swap(str[k],str[i]);//交换ik
perm(fp,str,k+1,m);
swap(str[k],str[i]);//在判断是否重复之后递归
}
}
int main()
{
char str[505];
int n,i;
FILE* ft= fopen("input.txt","r");
FILE* fp= fopen("output.txt","w+");
if (ft == NULL) {
printf("文件读取错误");
}
fscanf(ft, "%d", &n);
fscanf(ft, "%s", &str[i]);
ans=0;
perm(fp,str,0,n-1) ;
fprintf(fp,"%d",ans);
printf("\n Please check the output.txt\n");
return 0;
}
#include <algorithm>
#include <cstdio>
using namespace std ;
long long ans;
int ok(char str[],int a ,int b )
{
if(b>a)
for(int i=a;i<b;i++)
if(str[i]==str[b])
return 0;
return 1;
}
void perm(FILE* fp,char str[],int k,int m)
{
int i;
if(k==m)
{
ans++;
for(i=0;i<=m;i++)
fprintf(fp,"%c",str[i]);
fprintf(fp,"\n");
return ;
}
else for(i=k;i<=m;i++)
if(ok(str,k,i))
{
swap(str[k],str[i]);//交换ik
perm(fp,str,k+1,m);
swap(str[k],str[i]);//在判断是否重复之后递归
}
}
int main()
{
char str[505];
int n,i;
FILE* ft= fopen("input.txt","r");
FILE* fp= fopen("output.txt","w+");
if (ft == NULL) {
printf("文件读取错误");
}
fscanf(ft, "%d", &n);
fscanf(ft, "%s", &str[i]);
ans=0;
perm(fp,str,0,n-1) ;
fprintf(fp,"%d",ans);
printf("\n Please check the output.txt\n");
return 0;
}
这里也就是运用简单的递归来实现,但是需要注意的有:
1.多了重复的数字,所以用ok函数来判断是否相同。
2.在判断了是否相同之后也就是简单的全排列函数。
3.在main函数里面声明的fp函数由于要在perm函数当中使用所以要记得传参。
0 0
- 8594 有重复元素的排列问题
- 8594 有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的全排列问题
- 8594 有重复元素的排列问题
- 有重复元素的全排列问题
- 有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的排列问题
- 【9501】有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的全排列问题
- 有重复元素的排列问题
- 有重复元素的排列问题
- 有重复元素的全排列问题
- 数组进阶
- 【问题集】Provided dependencies can only be jars
- 林大OJ 60
- JFinal在网络服务端开发中的位置
- 计算完全最短路径的Floyd算法
- 有重复元素的排列问题
- PagerAdapter学习
- python笔记1
- codeforces-148B-Escape
- android 自定义View知识点
- 【BZOJ 2120】 数颜色 (乱搞分块,直指暴力)
- forward和redirect的区别
- 《Linux内核设计与实现》——第1、2章(内核简介)
- Hadoop MapReduce模块 Module 4: MapReduce