https://www.acmicpc.net/problem/1759
#1759: 비밀번호 만들기
두 개의 정수 L과 C가 첫 번째 줄에 주어집니다.
(3 ≤ L ≤ C ≤ 15) 다음 줄에는 C 문자가 공백으로 구분되어 지정됩니다.
주어진 문자는 알파벳의 소문자이며 겹치지 않습니다.
www.acmicpc.net
1. 입력한 C글자를 오름차순으로 정렬
2. C에서 L을 선택합니다.
역추적에 의한 선택(조합론)출력 배열에 넣습니다.
3. 출력 배열에서 L이 포함된 문자를 확인합니다.
-> 자음이 2개 이상, 모음이 1개 이상인지 확인
-> 입력이 맞으면 오름차순으로 출력 후 종료
-> 조건이 만족되지 않으면 함수는 출력 없이 종료
#include <iostream>
#include <algorithm>
#define MAX_N 16
using namespace std;
char in(MAX_N), out(MAX_N);
int visited(MAX_N);
int L, C;
void solution(int depth, int start) {
int v = 0, c = 0;
if(depth == L) {
for(int i = 0; i < L; i++) {
if(out(i) == 'a' || out(i) == 'e' || out(i) == 'i' || out(i) == 'o' || out(i) == 'u') {
v++;
}
else c++;
if(v >= 1 && c >= 2) {
sort(out, out + L);
for(int i = 0; i < L; i++)
cout << out(i);
cout << "\n";
return;
}
else continue;
}
return ;
}
else {
for(int i = start; i < C; i++) {
if(!
visited(i)) {
visited(i) = true;
out(depth) = in(i);
solution(depth + 1, i + 1);
visited(i) = false;
}
}
}
}
int main() {
cin >> L >> C;
for(int i = 0; i < C; i++)
cin >> in(i);
sort(in, in + C);
solution(0, 0);
}