題目大意:
mxy 正要經過新世界的大門。
現在有很多人在門口排隊,每個人將會被髮到一個有效的通行密碼作爲門票。一個有
效的密碼由 L(3 <= L <= 15)個小寫字母(‘a’…‘z’)組成,至少有一個元音(‘a’, ‘e’, ‘i’,
‘o’ 或 ‘u’)和兩個輔音(除去元音以外的音節),並且是按字母表順序出現的(例如,‘abc’
是有效的,而’bac’不是) 。
mxy 想要知道今天的有效密碼是什麼。
現在給定一個期望長度 L 和 C(1 <= C <= 26)個小寫字母,寫一個程序,輸出所有的
長度爲 L、能由這給定的 C 個字母組成的有效密碼。密碼必須按字母表順序打印出來,一行
一個。
解題思路:
數據很小,直接暴搜
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int C, L, sum;
char a[30], c[30];
void dfs(int now, int num) {
if (sum == 25000) return;
if (num == L) {
int yy = 0, fy = 0;
for (int i = 1; i <= L; ++i) {
if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
++yy; else ++fy;
}
if (yy && fy > 1) {
for (int i = 1; i <= L; ++i)
putchar(a[i]);
putchar('\n');
++sum;
}
return;
}
for (int i = now + 1; i <= C; ++i) {
a[num+1] = c[i];
dfs(i, num + 1);
}
}
int main() {
scanf("%d %d", &L, &C);
for (int i = 1; i <= C; ++i)
cin >> c[i];
sort(c+1, c+C+1);
int n = C - L + 1;
for (int i = 1; i <= n; ++i) {
a[1] = c[i];
dfs(i, 1);
}
}