现在的位置: 首页 > 综合 > 正文

C基础/指定长度的字符串排列问题

2018年05月26日 ⁄ 综合 ⁄ 共 1173字 ⁄ 字号 评论关闭
/* 
	指定长度的字符串排列问题 
	Time : 2012 4 4 20:22
	Author : C 
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 100
static char s[max],c[max],t[max][max],a[max];
static int length,judge,number=0,j=0,count=0;
static bool v[max];
void DelDouble();
void DFS(char *s,int len);
int main();
void print()
{
	puts("          ●●●●●●          ");
	puts("         ●全排列问题●         ");
	puts("          ●●●●●●          ");
	puts("请输入字符串:");
	scanf("%s",s); 
	puts("请选择是否剔除重复字符?");
	puts("1: 剔除重复字符");
	puts("2: 不剔除重复字符");
	scanf("%d",&judge); 
	if(judge == 1)	DelDouble();
	else	strcpy(c,s);
	judge = 0;
	for(int i=0;c[i]!='\0';i++)
		v[i]=0;
	puts("处理后字符串:");
	puts(c); 
	puts("请输入排列长度:");
	scanf("%d",&length);
	if(length > strlen(c)){
		puts("输入有误 请重新输入 :");
		memset(c,0,sizeof(c));
		memset(s,0,sizeof(s));
		main();
	}	
	puts("排列组合情况:");
	DFS(c,length);
}
void out()
{
	char tt[max][max];
	int n=0,x;
	for(int i=0;i<count;i++)
	{
		for(x=0;x<n;x++)
			if(strcmp(tt[x],t[i])==0)	break;	
		if(x==n)
				strcpy(tt[n++],t[i]);
	} 
	for(int i=0;i<n;i++)
		printf("%s\t",tt[i]);
}
void DelDouble()
{
	int i,j,count=0;
	for(i=0;s[i]!='\0';i++)
		if(strchr(c,s[i])==NULL)	c[count++]=s[i];
	c[count]='\0';
}
void DFS(char *s,int k)	/*求全排列  组合*/
{
     int i;
     if(j!=length)
     {
	      for(i=0;i<strlen(s);i++)
	         if(v[i]==0)
	          {
		            v[i]=1;		 
		            a[j]=s[i];
		            j++;
					DFS(s,k+1);
		            v[i]=0;
	         }
     }else{
       		a[j]='\0';
	        strcpy(t[count],a);
	        count++;  
     }
     j--; 
}
int main()
{
	print();
	out();		
}

抱歉!评论已关闭.