特长生模拟——门票

题目大意:
一个有效的密码由多个小写字母(‘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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值