牲口棚的安全(STl全排列算法)

发布于 2018-03-06  866 次阅读


Description

农夫为他的牲口棚安装了一套新的安全系统。现在需要为牛群中的每头母牛设定一个有效的秘密。一个有效的密码由L(3 <= L <= 15)个不同的小写字母组成(即为传统的拉丁字符’a’…’z’),其中至少包含一个元音字母('a', 'e', 'i', 'o', 或'u')和至少两个辅音字母(非元音字母),而且字母必须按字母表顺序排列(如:'abc' 是有效密码; 'bac' 是无效密码)。

Input

第一行是两个整型数L和C( 3 <= L <= 15 )( L <= C <= 20 ),以空格间隔。 第二行是构成密码字符串的C个小写字母,以空格间隔。

Output

输出是一个长度为L的密码字符串(密码字符串中没有空格)。同时要求密码字符串必须按字母表的顺序依次输出。密码字符串之间以换行间隔。

Sample Input

4 6
a t c i s w

Sample Output

acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw

代码

#include 
#include 
#include 
using namespace std;
char alp[21], str1[21], str2[21], str3[21];
int yy(string a, int l) // 判断元音个数 
{
	int cnt = 0;
	for(int i = 0; i < l; i++)
	{
		if(a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u' )
			cnt++;
	}	
	return cnt;
}
int main()
{
	int l, c;
	int yycnt;
	cin >> l >> c;
	for(int i = 0; i < c; i++)
		cin >> alp[i];
	sort(alp, alp + c); 
	do
	{
		yycnt = yy(alp, l);
		if(yycnt > 0 && l - yycnt > 1)
		{
			for(int i = 0; i < l; i++)
				str1[i] = alp[i];
			strcpy(str2, str1);
			sort(str2, str2 + l);
			if(!strcmp(str2, str1))
			{
				if(strcmp(str3, str1))
				{
					strcpy(str3, str1);
					cout << str1 << endl;
				}
			}
		}		
	}while(next_permutation(alp, alp + c)); // 全排列算法	
}