2021.07.07【普及组】模拟赛C组比赛解析
谷仓的安保(passwd)
题目描述
Farmer John给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛分配一个有效的密码。一个有效的密码由L(3 <= L <= 15)个小写字母(来自传统的拉丁字母集’a’…‘z’)组成,至少有一个元音(‘a’, ‘e’, ‘i’, ‘o’, 或 ‘u’)和两个辅音(除去元音以外的音节),并且是按字母表顺序出现的(例如,'abc’是有效的,而’bac’不是) 。给定一个期望长度L和C个小写字母,写一个程序,打印出所有的长度为L、能由这给定的C个字母组成的有效密码。密码必须按字母表顺序打印出来,一行一个。你的程序只需输出前25,000个有效密码,即使后面还存在有效密码。
解题思路
写一个递归+全排列,然后输出前先判断元音和辅音即可
局部代码
#include<bits/stdc++.h>
using namespace std;
int l,c,s;
char a[27],b[27],u[27];
void dg(int x,int z)
{
if(x>l)
{
int s1,s2,y=0;
s1=s2=0;
for(int i=1;i<=l;i++)
{
if(b[i]=='a'||b[i]=='e'||b[i]=='i'||b[i]=='o'||b[i]=='u')
{
s1++;
}
else s2++;
if(s1>=1&&s2>=2)
{
y++;
break;
}
}
if(y)
{
int k=1;
for(int i=1;i<=l;i++)
{
if(b[i]!=u[i])
{
k=0;
break;
}
}
if(!k)
{
s++;
for(int i=1;i<=l;i++)
{
cout<<b[i];
}
cout<<endl;
for(int i=1;i<=l;i++)
{
u[i]=b[i];
}
}
}
if(s>=25000)exit(0);
return;
}
for(int i=z;i<=c+1;i++)
{
b[x+1]=a[i];
dg(x+1,i+1);
b[x+1]=0;
}
}
int main()
{
freopen("passwd.in"