https://www.acmicpc.net/problem/1759
전형적인 백트래킹
문제라고 생각하는데 몇가지 조건을 추가해주면 된다.
첫째, 암호는 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다고 하였으니 출력하게 되는 암호에 최소 한 개의 모음이 있어야 하고 최소 두 개의 자음이 있어야 한다.
둘째, 암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되었을 것이라고 하였으니 입력받은 C개의 문자들을 sort해야 한다.
#include <bits/stdc++.h>
using namespace std;
int l,c;
char alphabet[16];
int arr[16];
bool isused[16];
void func(int k) {
if(k == l) {
int vowels = 0, consonants = 0;
for(int i = 0; i < k; i++) {
if(alphabet[arr[i]] == 'a' || alphabet[arr[i]] == 'e' || alphabet[arr[i]] == 'i' || alphabet[arr[i]] == 'u' || alphabet[arr[i]] == 'o')
++vowels;
else
++consonants;
}
if(vowels == 0)
return;
if(consonants < 2)
return;
for(int i = 0; i < k; i++) {
cout << alphabet[arr[i]];
}
cout << '\n';
return;
}
int st = 0;
if(k != 0)
st = arr[k-1];
for(int i = st; i < c; i++) {
if(!isused[i]) {
arr[k] = i;
isused[i] = 1;
func(k+1);
isused[i] = 0;
}
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> l >> c;
for(int i = 0; i < c; i++)
cin >> alphabet[i];
sort(alphabet,alphabet+c);
func(0);
return 0;
}