1. N과 M
문제 참고 : https://www.acmicpc.net/problem/15649
풀이
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void make_nm(int, int, int);
vector<int> a;
vector<bool> c;
int main() {
int m, n;
cin >> n >> m; //입력받기
a.assign(10, 0); // 할당
c.assign(10, false); // 할당
make_nm(n, m,0);
}
void make_nm(int n, int m, int idx) {
// 성공조건
if (idx == m) {
// 출력
for (int i = 0; i < m; i++) {
cout << a[i]<<" ";
}
cout << "\n"; // 줄바꿈
return;
}
for (int i = 1; i <= n; i++) {
// true면 중복
if (c[i])
continue;
a[idx] = i;
c[i] = true; // 포함체크
make_nm(n, m, idx + 1);
c[i] = false; // 빼기체크
}
}
2. N과 M(2) 오름차순
문제 참고 : https://www.acmicpc.net/problem/15650
풀이
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void make_nm(int, int, int, int);
vector<int> a;
vector<bool> c;
int main() {
int m, n;
cin >> n >> m; //입력받기
a.assign(10, 0); // 할당
c.assign(10, false); // 할당
make_nm(n, m, 0, 1);
}
void make_nm(int n, int m, int idx, int prev) {
// 성공조건
if (idx == m) {
// 출력
for (int i = 0; i < m; i++) {
cout << a[i] << " ";
}
cout << "\n"; // 줄바꿈
return;
}
for (int i = prev; i <= n; i++) {
// true면 중복
if (c[i])
continue;
a[idx] = i;
c[i] = true; // 포함체크
make_nm(n, m, idx + 1, i);
c[i] = false; // 빼기체크
}
}
3. N과 M(3) 중복가능
문제 참고 : https://www.acmicpc.net/problem/15651
풀이
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void make_nm(int, int, int, int);
vector<int> a;
vector<bool> c;
int main() {
int m, n;
cin >> n >> m; //입력받기
a.assign(10, 0); // 할당
c.assign(10, false); // 할당
make_nm(n, m, 0, 1);
}
void make_nm(int n, int m, int idx, int prev) {
// 성공조건
if (idx == m) {
// 출력
for (int i = 0; i < m; i++) {
cout << a[i] << " ";
}
cout << "\n"; // 줄바꿈
return;
}
for (int i = 1; i <= n; i++) {
// true면 중복
// if (c[i])
// continue;
a[idx] = i;
c[i] = true; // 포함체크
make_nm(n, m, idx + 1, i);
c[i] = false; // 빼기체크
}
}
4. N과 M(4) 중복가능 비내림차순
문제 참고 : https://www.acmicpc.net/problem/15652
풀이
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void make_nm(int, int, int, int);
vector<int> a;
vector<bool> c;
int main() {
int m, n;
cin >> n >> m; //입력받기
a.assign(10, 0); // 할당
c.assign(10, false); // 할당
make_nm(n, m, 0, 1);
}
void make_nm(int n, int m, int idx, int prev) {
// 성공조건
if (idx == m) {
// 출력
for (int i = 0; i < m; i++) {
cout << a[i] << " ";
}
cout << "\n"; // 줄바꿈
return;
}
for (int i = prev; i <= n; i++) {
// true면 중복
// if (c[i])
// continue;
a[idx] = i;
c[i] = true; // 포함체크
make_nm(n, m, idx + 1, i);
c[i] = false; // 빼기체크
}
}
'Archived(CSE Programming) > 알고리즘(C++)' 카테고리의 다른 글
그래프의 탐색(DFS, BFS) (0) | 2019.08.15 |
---|---|
그래프(Graph) (0) | 2019.08.14 |
비트마스크(BitMask) (0) | 2019.08.12 |
재귀함수(Recursive Function) (0) | 2019.08.12 |
순열(Permutation) 구하기 (0) | 2019.08.07 |