您的位置:首页 > 编程语言 > C语言/C++

有重复元素的排列问题

2016-10-21 11:06 246 查看
问题描述:设R={r1,r2,r3,r4..rn},其中可能存在重复的元素,设计一种算法列出所有不同的排列

树的思想:我们知道如果没有相同的元素那么所有不同的排列就是所有的元素全部排列,但是当有重复元素的时候

在同一个位置相同的元素只能出现一次,那么当深度为1的时候处在同一层中元素不能有相同的,其他的层也是如此

这样当我们从根节点到达叶子节点的时候就是一种。
算法实现如下:

#include<stdio.h>
#define n 4
char res
;
int check(char a[],int i,int tag[])
{

for(int j=i;j<n;j++)
{
if(a[i]==a[j]&&i!=j&&tag[j]==0)//检查在a[i]之后是否有重复元素
{
//printf("i:%d,j:%d",i,j);
return false;
}
}
return true;
}
void compute(char a[],int tag[],int deep)
{
if(deep>=n)
{
for(int h=0;h<n;h++)
printf("%c",res[h]);
printf("\n");
return;
}
int temp=deep;
for(int i=0;i<n;i++)
{

if(tag[i]==0)
{

if(check(a,i,tag))//如果有重复元素那么跳过
{

res[deep]=a[i];
tag[i]=1;
compute(a,tag,++deep);
tag[i]=0;
deep=temp;
}

}
}
}

void main()
{
int tag
={0,0,0,0};
char a
={'a','a','c','c'};
compute(a,tag,0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息