홍시홍의 프로그래밍

[백준 15649] N과 M(1) 본문

알고리즘 문제풀이/백준

[백준 15649] N과 M(1)

홍시홍 2020. 3. 12. 00:32

요구사항

combination 구현

 

풀이

백트래킹을 이용하여 항상 앞에서 부터 방문했는지 검사해가며 체크한다

 

매일 구현하던 방법으로 구현하였을때 오름차순으로 되지 않아 약간 힘들었다

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int visit[10];
int map[10];
int n, m;
vector<int> v;
void com(int now, int cnt, int want) {
	if (cnt == want) {
		for (int i = 0; i < want; i++) {
			printf("%d ", v[i]);
		}
		printf("\n");
		return;
	}
	for (int i = 0; i < n; i++) {
		if (visit[i] == 1) continue;
		visit[i] = 1;
		v.push_back(map[i]);
		com(i + 1, cnt + 1, want);
		visit[i] = 0;
		v.pop_back();
	}
	
}
void swap(int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
void per(int now, int cnt) {
	if (cnt == m) {
		for (int i = 0; i < cnt; i++) {
			printf("%d ", map[i]);
		}
		printf("\n");
		return;
	}
	for (int i = 0; i < n; i++) {
		if (visit[i] == 1) continue;
		visit[i] = 1;
		swap(&map[i], &map[cnt]);
		per(now+1,cnt+1);
		visit[i] = 0;
		swap(&map[i], &map[cnt]);
	}
}
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) {
		map[i] = i + 1;
	}
	//per(0, 0);
	com(0, 0, m);
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 15651] N과 M(3)  (0) 2020.03.12
[백준 15650] N과 M(2)  (0) 2020.03.12
[백준 1041] 주사위  (0) 2020.03.12
[백준 1205] 등수 구하기  (0) 2020.03.11
[백준 11399] ATM  (0) 2020.03.10
Comments