SSLOJ 買門票 5月11日提高B組 T2

題目大意:

mxy 正要經過新世界的大門。
現在有很多人在門口排隊,每個人將會被髮到一個有效的通行密碼作爲門票。一個有
效的密碼由 L(3 <= L <= 15)個小寫字母(‘a’…‘z’)組成,至少有一個元音(‘a’, ‘e’, ‘i’,
‘o’ 或 ‘u’)和兩個輔音(除去元音以外的音節),並且是按字母表順序出現的(例如,‘abc’
是有效的,而’bac’不是) 。
mxy 想要知道今天的有效密碼是什麼。
現在給定一個期望長度 L 和 C(1 <= C <= 26)個小寫字母,寫一個程序,輸出所有的
長度爲 L、能由這給定的 C 個字母組成的有效密碼。密碼必須按字母表順序打印出來,一行
一個。

解題思路:

數據很小,直接暴搜

Accepted code:Accepted\ code:

#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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章