Study hard

(c++)백준 14889번: 스타트와 링크 본문

백준/bfs, dfs

(c++)백준 14889번: 스타트와 링크

Nimgnoej 2020. 10. 17. 11:22

www.acmicpc.net/problem/14889

 

14889번: 스타트와 링크

예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.

www.acmicpc.net

[풀이]

dfs 조합으로 모든 경우의 수를 탐색하는 문제였다.

매 경우의 수마다 스타트 팀과 링크 팀의 능력치 차를 계산하여 최소값을 갱신한다.

 

#include <iostream>
#include <algorithm>//min
#include <cstdlib>//abs
using namespace std;

int N;
int S[21][21];
bool Select[21];//스타트 팀에 속한 사람
int totalS = 0;
int Min = 987654321;

void getDiff() {
	int Start = 0;
	int Link = 0;
	for (int i = 1; i <= N; i++) {
		if (Select[i] == true) {
			for (int j = 1; j <= N; j++) {
				if (i == j)
					continue;
				if (Select[j] == true) {
					Start += S[i][j];
				}
			}
		}
	}
	for (int i = 1; i <= N; i++) {
		if (Select[i] == false) {
			for (int j = 1; j <= N; j++) {
				if (i == j)
					continue;
				if (Select[j] == false) {
					Link += S[i][j];
				}
			}
		}
	}
	int diff = abs(Start - Link);
	Min = min(Min, diff);
}

void setStart(int idx, int cnt) {
	if (cnt == N / 2) {
		getDiff();
		return;
	}
	for (int i = idx; i <= N; i++) {
		if (Select[i] == true)
			continue;
		Select[i] = true;
		setStart(i, cnt + 1);
		Select[i] = false;
	}
}

void solution() {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			cin >> S[i][j];
		}
	}
	setStart(1, 0);
	cout << Min << '\n';
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	solution();
	return 0;
}

'백준 > bfs, dfs' 카테고리의 다른 글

(c++)백준 16236번: 아기 상어  (0) 2020.10.17
(c++)백준 17142번: 연구소 3  (0) 2020.10.17
(c++)백준 15684번: 사다리 조작  (0) 2020.10.16
(c++)백준 12100번: 2048 (Easy)  (0) 2020.10.16
(c++)백준 13460번: 구슬 탈출 2  (0) 2020.10.16