题目大意:
一个有效的密码由多个小写字母(‘a’…’z’)组成,至少有一个元音(‘a’, ‘e’, ‘i’,’o’ 或 ‘u’)和两个辅音(除去元音以外的音节),并且是按字母表顺序出现的(例如,’abc’是有效的,而’bac’不是) 。
现在给定一个期望长度L 和C 个小写字母,mxy想知道所有的长度为L、能由这给定的C个字母组成的有效密码。密码必须按字母表顺序打印出来,如果数量多于25000个,则告诉mxy前25000个有效密码,即使后面还存在有效密码。
3 <= L <= 15
1 <= C <= 26
保证只出现小写字母
题解:
直接就是一个搜索:
直接按字典序按顺序搜字母求组合。
注意一下:
1.判断元音辅音数量是否达标。
2.去重复
var
a:array [0..16] of char;
b:array ['a'..'z'] of longint;
ans:array [0..25001] of string;
flag:array [1..2] of longint;
sum,i,j,n,m:longint;
c:string;
procedure dfs(dep:longint;o:char;now:string);
var
i:char;
begin
if dep>n then
begin
if now=ans[sum] then exit;
if flag[1]=0 then exit;
if flag[2]<2 then exit;
inc(sum);
ans[sum]:=now;
if sum=25000 then
begin
for j:=1 to sum do writeln(ans[j]);
close(input); close(output);
halt;
end;
exit;
end;
for i:=o to 'z' do
if b[i]>0 then
begin
if (i='a') or (i='e') or (i='i')
or (i='o') or (i='u')
then inc(flag[1])
else inc(flag[2]);
dec(b[i]);
dfs(dep+1,i,now+i);
inc(b[i]);
if (i='a') or (i='e') or (i='i')
or (i='o') or (i='u')
then dec(flag[1])
else dec(flag[2]);
end;
end;
begin
assign(input,'ticket.in'); reset(input);
assign(output,'ticket.out'); rewrite(output);
readln(n,m);
readln(c);
for i:=1 to length(c) do
if c[i]<>' ' then b[c[i]]:=b[c[i]]+1;
dfs(1,'a','');
for i:=1 to sum do writeln(ans[i]);
close(input); close(output);
end.