[ ALGORITHM ]/[ 백 준 ]
[BAEKJOON] 15649번 N과 M (1)
HiStar__
2020. 6. 13. 18:18
문 제
소 스 코 드
#include<iostream>
void Func(int , const int& , const int& , int *, bool *);
int main() {
int N, M;
while (1) {
std::cin >> N >> M;
if (M >= 1 && M <= N) {
if (N >= M && N <= 8) break;
}
}
int *temp { new int[M] };
bool *tf { new bool[N] };
for (int i = 0; i < N; ++i) tf[i] = false;
Func(0, N, M, temp, tf);
delete[] tf;
delete[] temp;
return 0;
}
void Func(int seq, const int& n, const int& m, int* temp, bool* tf) {
if (m == seq) {
for (int i = 0; i < m; ++i) std::cout << temp[i] << " ";
std::cout << "\n";
return;
}
for (int i = 0; i < n; ++i) {
if (false == tf[i]) {
tf[i] = true;
temp[seq] = i + 1;
Func(seq + 1, n, m, temp, tf);
tf[i] = false;
}
}
}
풀 이
백트래킹 : 재귀 호출을 사용하면 간단하게 구현이 가능하다. 재귀 호출이 너무 많이 반복 하면 메모리 부족으로 강제 종료 될 수 있다.
std::endl / '\n' 의 차이점 : endl의 경우 출력 버퍼를 지워야 하기 때문에 시간이 오래 걸린다고 한다.
결 과 값
문 제 출 처
문제 링크 : [ BAEKJOON ] https://www.acmicpc.net/problem/15649