본문 바로가기
백준(C언어)/23년 3월

백트랙킹 - 14889번

by C0MPAS 2023. 3. 3.

3월 3일(금) - 백트랙킹 - 14889번

 

14889번: 스타트와 링크

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

(참고 -> https://icanyoucanwecan.tistory.com/76 )

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>
#include <string.h>
#define MAX 987654321

int visit[21];
int map[22][22];
int N, MIN;

int abs(int a)
{
	return a < 0 ? -1 * a : a;
}

void DFS(int cur, int n)
{
	if (n == N / 2)
	{
		int team_1 = 0;
		int team_2 = 0;
		int team_bal = 0;
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				if (visit[i] == 1 && visit[j] == 1)
				{
					team_1 += map[i][j];
				}
				else if (visit[i] == 0 && visit[j] == 0)
				{
					team_2 += map[i][j];
				}
			}
		}
		team_bal = abs(team_1 - team_2);
		if (MIN > team_bal)
		{
			MIN = team_bal;
		}

		return;
	}

	for (int i = cur + 1; i < N; i++)
	{
		visit[i] = 1;
		DFS(i, n + 1);
		visit[i] = 0;
	}

	return;
}

int main(void)
{
	MIN = MAX;
	scanf("%d", &N);

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			scanf("%d", &map[i][j]);
		}
	}

	for (int i = 0; i < N; i++)
	{
		visit[i] = 1;
		DFS(i, 1);
		visit[i] = 0;
	}

	printf("%d\n", MIN);
	return 0;
}

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(C언어) > 23년 3월' 카테고리의 다른 글

[C] 백준 - 9184번: 신나는 함수 실행  (0) 2023.03.06
동적 계획법 1 - 24416번  (0) 2023.03.06
반복문 - 25314번  (0) 2023.03.02
(*풀이진행중)백트랙킹 - 14889번  (0) 2023.03.02
백트랙킹 - 14888번  (0) 2023.03.01

댓글