【dfs】买门票
買門票
題目大意:
給出一些字母,求出可組合成的組合(要按順序,和一定的規則)
原題:
題目描述
mxy 正要經過新世界的大門。
現在有很多人在門口排隊,每個人將會被發到一個有效的通行密碼作為門票。一個有
效的密碼由 L(3 <= L <= 15)個小寫字母(‘a’…‘z’)組成,至少有一個元音(‘a’, ‘e’, ‘i’,
‘o’ 或 ‘u’)和兩個輔音(除去元音以外的音節),并且是按字母表順序出現的(例如,‘abc’
是有效的,而’bac’不是) 。
mxy 想要知道今天的有效密碼是什么。
現在給定一個期望長度 L 和 C(1 <= C <= 26)個小寫字母,寫一個程序,輸出所有的
長度為 L、能由這給定的 C 個字母組成的有效密碼。密碼必須按字母表順序打印出來,一行
一個。
輸入
輸入數據共 2 行。
第 1 行: 兩個由空格分開的整數,L 和 C。(3 <= L <= 15,1 <= C <= 26)
第 2 行: C 個由 1 個空格隔開的小寫字母,密碼是由這個字母集中的字母來構建的。
輸出
若干行,每行輸出一個長度為 L 個字符的密碼(沒有空格)。輸出行必須按照字母順序
排列。你的程序只需輸出前 25000 個有效密碼,即使后面還存在有效密碼。
輸入樣例
4 6 a t c i s w輸出樣例
acis acit aciw acst acsw actw aist aisw aitw astw cist cisw citw istw解題思路:
直接dfs枚舉每個位置就可以了
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int l,c,sum; char d[105],a[105]; char read() {char x;cin>>x;while (x<'a'||x>'z') cin>>x;//避開其他的return x; } void dfs(int dep,int y,int k) {if (sum>=25000) return;if (dep>l){if (y>=1&&l-y>=2)//符合規則{sum++;for (int i=1;i<=l;++i)putchar(d[i]);putchar(10);}return;}for(int i=k;i<=c;++i){d[dep]=a[i];//記錄if (a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')//元音字母dfs(dep+1,y+1,i+1);//dfselse dfs(dep+1,y,i+1);} } int main() {scanf("%d %d",&l,&c);for (int i=1;i<=c;++i)a[i]=read();sort(a+1,a+1+c);//排序dfs(1,0,1); }總結
- 上一篇: 用电脑更舒适更好的使用电脑
- 下一篇: 想做废品回收想做废品回收站挣钱吗