特长生模拟——门票

来源:互联网 发布:中华名人名篇网络 编辑:程序博客网 时间:2024/06/10 15:18

题目大意:
一个有效的密码由多个小写字母(‘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.
1 0