문제 : https://www.acmicpc.net/problem/15649


[알고리즘풀이]

중복을 허락하지 않으면서 모든 경우를 뽑아야 하므로, 방문한 지점을 체크하는 배열을 활용한 백트레킹 기법으로 문제를 해결한다.

#include<iostream>
#include<vector>
using namespace std;

int n, m;
bool visited[9];
vector<int> v;
void bt(int);

int main(void) {
	cin >> n >> m;
	bt(0);
}

void bt(int cnt) {
	if (cnt == m) {
		for (int i = 0; i < m; i++)
			cout << v[i] << ' ';
		cout << '\n';
		return;
	}
	for (int i = 1; i <= n; i++) {
		if(!visited[i]){
			visited[i] = true;
			v.push_back(i);
			bt(cnt + 1);
			visited[i] = false;
			v.pop_back();
		}
	}
}

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 15651 - N 과 M (3)  (0) 2019.09.08
[BOJ] 15650 - N 과 M (2)  (0) 2019.09.08
[BOJ] 2240 - 자두나무  (0) 2019.09.04
[BOJ] 1937 - 욕심쟁이 판다  (0) 2019.09.03
[BOJ] 2156 - 포도주 시식  (0) 2019.09.03

+ Recent posts