본문 바로가기
CS/알고리즘

백준 17779 게리맨더링2

by zieunee 2020. 3. 4.
반응형

https://www.acmicpc.net/problem/17779

 

소스가 많이 별로지만.... 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int N, map[21][21], area[21][21];
int arr[6];
int res = 987654321;
int dy[4] = { -1,1,1,-1 };
int dx[4] = { 1,1,-1,-1 };

void solve(int x, int y, int d1, int d2) {
	
		////5번선거구(경계선만) 
	int nx = x, ny = y;
	area[x][y] = 5;
	int dir = 0;
	for (int z = 0; z < 2; z++) {
		for (int i = 0; i < d1; i++) {
			nx = nx + dx[dir];
			ny = ny + dy[dir];
			area[nx][ny] = 5;
		}
		++dir;
		for (int j = 0; j < d2; j++) {
			nx = nx + dx[dir];
			ny = ny + dy[dir];
			area[nx][ny] = 5;
		}
		++dir;
	}

	//1번 선거구
	for (int i = 1; i < x + d1; i++) {
		for (int j = 1; j <= y; j++) {
			if (area[i][j] == 5) break;
			area[i][j] = 1;
		}
	}
	//2번 선거구
	for (int i = x + d2; i >= 1; i--) {
		for (int j = N; j >= y + 1; j--) {
			if (area[i][j] == 5) break;
			area[i][j] = 2;
		}
	}

	//3번 선거구
	for (int i = x + d1; i <= N; i++) {
		for (int j = 1; j < y - d1 + d2; j++) {
			if (area[i][j] == 5) break;
			area[i][j] = 3;
		}
	}
	//4번 선거구
	for (int i = N; i >= x + d2 + 1; i--) {
		for (int j = N; j >= y - d1 + d2; j--) {
			if (area[i][j] == 5) break;
			area[i][j] = 4;
		}
	}

}

int main() {
	scanf("%d" ,&N);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf("%d" ,&map[i][j]);
		 }
	}
	
	//선거구 나눔 
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			for (int a = 1; a <= N; a++) {
				for (int b = 1; b <= N; b++) {
					//범위에 벗어나면 리턴 
					if (j - a >= 1 && j + b <= N && i + a + b <= N) {
						//	5구역으로 default
						for (int i = 1; i <= N; i++) {
							for (int j = 1; j <= N; j++) {
								area[i][j] = 0;
							}
						}

						solve(i, j, a, b);

						//선거구 1~5 까지 별로 인원 셈 
						for (int i = 1; i <= N; i++) {
							for (int j = 1; j <= N; j++) {
								if (area[i][j] == 0) { //경계선과 그사이에있는것들은 5번으로 매꿔줌 
									area[i][j] = 5;
								}
								arr[area[i][j]] = arr[area[i][j]] + map[i][j];
								
							}
						}

						int maxArea = 0;
						int minArea = 987654321;
						//최솟값
						for (int i = 1; i <= 5; i++) {
							maxArea = max(arr[i], maxArea);
							minArea = min(arr[i], minArea);
						}

						//인구가 가장 많은 선거구와 가장 적은 선거구의 인구 차이의 최솟값
						res = min(res, (maxArea - minArea));

						for (int i = 1; i <= 5; i++) {
							arr[i] = 0;
						}
					}
				}
			}
		}
	}
	printf("%d", res);
}
반응형

'CS > 알고리즘' 카테고리의 다른 글

백준 16236 아기상어(bfs)  (0) 2020.05.06
백준 17837 새로운 게임2  (0) 2020.03.05
백준 13460 구슬탈출2  (0) 2020.02.15
백준 1986 체스  (0) 2020.02.11
백준 5397 키로거  (0) 2020.02.10