POJ-3049 字母排列组合 (元音辅音要求)

Farmer John has installed a new security system on the barn and now must issue a valid password to the cows in the herd. A valid password consists of L (3 <= L <= 15) different lower-case characters (from the traditional latin character set 'a'...'z'), has at least one vowel ('a', 'e', 'i', 'o', or 'u'), at least two consonants (non-vowels), and has characters that appear in alphabetical order (i.e., 'abc' is valid; 'bac' is not). 

Given a desired length L along with C lower-case characters, write a program to print all the valid passwords of length L that can be formed from those letters. The passwords must be printed in alphabetical order, one per line.
Input
* Line 1: Two space-separated integers, L and C 

* Line 2: C space-separated lower-case characters that are the set of characters from which to build the passwords
Output
* Lines 1..?: Each output line contains a word of length L characters (and no spaces). The output lines must appear in alphabetical order.
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
Hint
INPUT DETAILS: 
Passwords of length 4 chosen from the given six characters

    看上去挺麻烦的题,又要有元音又要有辅音要求,要分开?没必要,直接上,搜就可以的。搜到结果是加一个判断,看元音、辅音个数是否符合标准,可以就输出。开始没发现有顺序的,输入完直接sort()一下就行,char类型 cmp不用另写。

代码如下:

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int n,m;
map<char,int>mp;
char p[16];
char ans[16];
int vis[16];
int dfs(int t,char ch)
{
    if(t==m)
    {
        int s=0;
        for(int i=1;i<=t;i++)
        {
            if(mp[ans[i]]==1)
                s++;
        }
        if(s>=1 && s<=(m-2))
        {
            for(int i=1;i<=t;i++)
                cout<<ans[i];
            cout<<endl;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==0 && p[i]>ch)
        {
            vis[i]=1;
            ans[t+1]=p[i];
            dfs(t+1,p[i]);
            vis[i]=0;
        }
    }
}
int main()
{
    mp['a']=1;
    mp['e']=1;
    mp['i']=1;
    mp['o']=1;
    mp['u']=1;
    while(cin>>m>>n && (m+n))
    {
        for(int i=1;i<=n;i++)
        {
            cin>>p[i];
        }
        sort(p+1,p+n+1);
        for(int i=1;i<=n;i++)
        {
            vis[i]=1;
            ans[1]=p[i];
            dfs(1,p[i]);
            vis[i]=0;
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值