슈뢰딩거의 고등어

[BOJ] 17779 게리맨더링 2 (c++) 본문

알고리즘

[BOJ] 17779 게리맨더링 2 (c++)

슈뢰딩거의 고등어 2022. 1. 13. 19:06

 

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

 

17779번: 게리맨더링 2

재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름

www.acmicpc.net

 

 

단순 구현 문제

어려울 것은 없지만 y, x 가 아닌 x, y 순으로 들어온다는 것만 주의하면 된다.

입력값이 크지 않아서 for 를 많이 돌려도 시간제한없이 통과한다.

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

int n, res;
int map[21][21];
int visit[21][21];

void divide(int x, int y, int d1, int d2) {
	bool answer = false;

	for(int i=1; i<=n; i++) 
		for(int j=1; j<=n; j++) 
			visit[i][j] = 0;

	for(int c=0; c<= d1; c++)
		visit[y-c][x+c] = 5;

	for(int i=0; i<= d2; i++)
		visit[y+i][x+i] = 5;

	for(int i=0; i<=d2; i++)
		visit[y-d1+i][x+d1+i] = 5;

	for(int i=0; i<=d1; i++)
		visit[y+d2-i][x+d2+i] = 5;

	for(int i=1; i<=n; i++) { // x
		int first = -1; int second = -1; 
		for(int j=1; j<=n; j++) {// y
			if(visit[j][i] == 5 && first == -1)
				first = j;
			else if(first != -1 && visit[j][i] == 5)
				second = j;
		}
		if(first != -1 && second != -1) {
			for(int n=first; n<=second; n++)
				visit[n][i] = 5;
		}
	}


	for(int c=1; c<=y; c++)
		for(int r=1; r<x+d1; r++) {
			if(visit[c][r] == 5) continue;
			visit[c][r] = 1;
		}

	for (int c=y+1; c<=n; c++)
		for(int r = 1; r<= x+d2; r++){
			if(visit[c][r] == 5) continue;
			visit[c][r] = 3;
		}

	for(int c=1; c<y-d1+d2; c++)
		for(int r=x+d1; r<=n; r++){
			if(visit[c][r] == 5) continue;
			visit[c][r] = 2;
		}

	for(int c=y-d1+d2; c<=n; c++) 
		for(int r=x+d2+1; r<= n; r++) {
			if(visit[c][r] == 5) continue;
			visit[c][r] = 4;
		}

	if(answer) {
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				printf("%d ", visit[i][j]);
			}
			printf("\n");
		}
	}


}

void count() {
	


	vector <int> v(5);
	for(int i=0; i<5; i++)
		v[i] = 0;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++) {
			v[visit[i][j]-1] += map[i][j];
		}

	sort(v.begin(), v.end());

	if(res > v[4] - v[0])
		res = v[4]-v[0];
	if(res > 19)
		return;

}

void solve() {
	for(int x=1; x <=n; x++) {
		for(int y=1; y<=n; y++) {
			for(int d1=1; d1<=n; d1++) {
				for(int d2 = 1; d2 <=n; d2++) {
					if((x < x+d1+d2 && x+d1+d2 <= n) && 1 <= y-d1 && y-d1 < y && y < y+d2 && y+d2 <= n) {
						divide(x, y, d1, d2);
						count();
					}
				}
			}
		}
	}

	
}

int main()
{
	res = 987654321;
	scanf("%d", &n);

	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
			scanf("%d", &map[j][i]);

	solve();


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

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

[백준] 23288 주사위 굴리기  (0) 2022.01.17
[백준] 19238 스타트택시  (0) 2022.01.17
[BOJ] 17822 원판돌리기 (c++)  (0) 2022.01.13
[BOJ] 17140 이차원 배열과 연산  (0) 2022.01.09
[BOJ] 15684 사다리타기 (c++)  (0) 2022.01.09
Comments