728x90
15650 N과 M (2)를 풀었다면 정말 쉽게 풀리는 문제이다.
#include <cstdio>
int N, M;
char a[15];
void repeated_permutation(int depth){
if (depth == M){
for (int i=0; i<2 * M; ++i) printf("%c", a[i]);
printf("\n");
return;
}
for (int i=1; i<=N; ++i){
a[depth * 2] = i + '0';
repeated_permutation(depth + 1);
}
}
int main() {
scanf("%d %d", &N, &M);
for (int i=0; i<2 * M; ++i) a[i] = ' ';
repeated_permutation(0);
return 0;
}
재귀 함수를 호출할 수록 depth는 깊어진다. depth는 몇번째 수까지 순열을 만들었는지를 의미하기도 한다.
depth를 고정시킨 채로, 수를 바꾸어 가며 중복 순열의 수를 만든다.
아랫 것은 stack을 이용한 버전이다.
#include <cstdio>
#include <vector>
using namespace std;
typedef vector<int> vi;
int N, M;
void printlnVector(vi & v){
for (int i=0; i<v.size(); ++i) printf("%d ", v[i]);
printf("\n");
}
void repeated_permutation(vi & v){
if (v.size() == M){
printlnVector(v);
return;
}
for (int i=1; i<=N; ++i){
v.emplace_back(i);
repeated_permutation(v);
v.pop_back();
}
}
int main() {
scanf("%d %d", &N, &M);
vi vec;
repeated_permutation(vec);
return 0;
}
728x90
'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글
[백트래킹] 백준 2580 스도쿠 (0) | 2019.09.19 |
---|---|
[백준] 15651 N과 M (4) - 중복조합 (0) | 2019.09.19 |
[백준] N과 M (2) - 조합 (0) | 2019.09.19 |
[백준] 15649 N과 M (1) - 순열 (2) | 2019.09.19 |
[BFS] 2206 벽 부수고 이동하기 (0) | 2019.09.12 |
댓글