任务描述
设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。
试着设计一个算法,列出R的所有不同排列。
即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。
输入描述
第1行是元素个数n,1<=n<=500。接下来的1行是待排列的n个元素,元素中间不要加空格。
输出格式
程序运行结束时,将计算输出n个元素的所有不同排列。最后1行中的数是排列总数。
测试说明
平台会对你编写的代码进行测试:
测试输入:4
aacc
预期输出:aacc
acac
acca
caac
caca
ccaa
6
开始你的任务吧,祝你成功!
问题分析:并不是简单的全排列问题,还要考虑到重复元素
所以我写了主函数,判断函数,递归函数,交换函数
#include<stdio.h>
int num=0;
//交换函数
void swap(char &a,char &b)
{
char temp;
temp=a;
a=b;
b=temp;
}
//判断函数,判断两个字符是否相等,相同返回1,不用交换,反之返回0,交换
int ok(char list[],int i,int j)
{
if(j>i)
{
for(int t=i;t<j;t++)
{
if(list[t]==list[j])
{
return 1;
}
}
}
return 0;
}
//递归函数
void perm(char list[],int n,int m)
{
if(n==m)
{
num++;
for(int i=1;i<=m;i++)
{
printf("%c",list[i]);
}
printf("\n");
}
else
{
for(int i=n;i<=m;i++)
{
if(!ok(list,n,i))
{
swap(list[n],list[i]);
perm(list,n+1,m);
swap(list[n],list[i]);
}
//两次交换又给换回去了
}
}
}
//主函数
int main()
{
int n;
scanf("%d",&n);
char s[100];
for(int i=0;i<=n;i++)
{
scanf("%c",&s[i]);//存到数组1—n里面
}
perm(s,1,n);
printf("%d\n",num);
return 0;
}
欢迎大家在评论区讨论