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

C语言实现全排列(部分算法参考网友,可实现重复字符的组合)

2011-04-12 10:01 567 查看
# include <stdio.h> 
# include <string.h> 

char s[100];
int n = 0;  
int t = 0;
int flage = 0;//描述两个数组是一样的
char Str[100][100];

//数据交换
void swap(char *a, char *b) 
{     
	char m;     
	m =  *a;     
	*a =  *b;     
	*b =  m; 
}  

void circle_right(char a[],int m,int i)
{
	char temp;
	int j,k; 
	for(k=1;k<=i-m;k++)
	{
		temp=a[i];
		for(j=i;j>m;j--)
		{
			a[j]=a[j-1];
		}
		a[m]=temp;
	}
}

void circle_left(char a[],int m,int i)
{
	char temp;
	int j,k; 
	for(k=1;k<=i-m;k++)
	{
		temp=a[m];
		for(j=m;j<i;j++)
		{
			a[j]=a[j+1];
		}
		a[i]=temp;
	}
}

void perm(int k,char a[],int l) 
{     
    int i;   
	
    if(k == 1)  
	{
		//将我们现在的组合复制进存储数组中,以备后面进行查询是否有重复
		for(i = 0; i < l; i++) 
		{
			Str[t][i] = s[i];

		}
		t++;

		//这里进行比较
		for(int s1 = 0; s1 < t-1; s1++)//这里比较是否有重复数组
		{
			int eq = 1;
			for(int s2 = 0; s2 <= l; s2++)//这个用来比较两个数组是否一样
			{
				if(Str[t-1][s2] != Str[s1][s2])
				{	
					eq = 0;
				}

			}
			if(eq == 1)
				flage = 1;
		}

		if(flage == 0)
		{
			for(i = 0; i < l; i++)             
			printf("%c", s[i]);        
			printf("/n");         
			n++; 			
		}
		else
			flage = 0;
		 
	}             
		
	for(i = 0; i < k; i++)         
	{
		swap(&a[0], &a[i]); 
		circle_right(a,1,i);
		perm(k-1,&a[1],l);   
		circle_left(a,1,i);
		swap(&a[i], &a[0]);             
     } 
}

int main() 
{
	int l;

	gets(s);

	l=strlen(s); 

    perm(l,s,l);     

    printf("total:%d/n", n);  

    return 0; 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: