欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【dfs】买门票

程序员文章站 2024-03-23 18:07:46
...

买门票

题目大意:

给出一些字母,求出可组合成的组合(要按顺序,和一定的规则)

原题:

题目描述

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);//dfs
	  	else 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);
}

上一篇: Arduino

下一篇: 中文转码unicode