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

 

17779번: 게리맨더링 2

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

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <utility>
#include <unordered_map>
#include <map>
#include <queue>
#include <stack>
#include <iomanip>
using namespace std;
// 게리맨더링 2  백준 17779 브루트포스
int N;
int MAP[21][21];
int result = 987654321;
void init() {
    ios::sync_with_stdio(false);
    cin.tie(0);    
}
 
bool one(int &x,int &y, int &d1, int &d2, int &i,int &j) {
    if (i >= 1 && i < x + d1 && j >= 1 && j <= y) {
        if (i >= x && j >= y - i + x) {
            return false;
        }
        return true;
    }
    return false;
}
bool two(int& x, int& y, int& d1, int& d2, int& i, int& j) {
    if (i >= 1 && i <= x + d2 && j > y && j <= N) {
        if (i >= x && j <= y + i - x) {
            return false;
        }
        return true;
    }
    return false;
}
bool three(int& x, int& y, int& d1, int& d2, int& i, int& j) {
    if (i >= x + d1 && i <= N && j >= 1 && j < y - d1 + d2) {
        if (i <= x + d1 + d2 && j >= y + d2 - d1 - (x + d1 + d2 - i)) {
            return false;
        }
        return true;
    }
    return false;
}
bool four(int& x, int& y, int& d1, int& d2, int& i, int& j) {
    if (i > x + d2 && i <= N && j >= y-d1+d2 && j <= N) {
        if (i <= x + d1 + d2 && j <= y + d2 - d1 + (x + d1 + d2 - i)) {
            return false;
        }
        return true;
    }
    return false;
}
void Divide_Areas(int& x, int& y, int& d1, int& d2) {
    int num_area[6= { 0 };
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (one(x, y, d1, d2, i, j)) {
                num_area[1+= MAP[i][j];
            }
            else if (two(x, y, d1, d2, i, j)) {
                num_area[2+= MAP[i][j];
            }
            else if (three(x, y, d1, d2, i, j)) {
                num_area[3+= MAP[i][j];
            }
            else if (four(x, y, d1, d2, i, j)) {
                num_area[4+= MAP[i][j];
            }
            else {
                num_area[5+= MAP[i][j];
            }
        }
    }
    sort(num_area + 1, num_area + 6);
    result = min(result, num_area[5- num_area[1]);
}
void choose_d1_d2(int &x, int &y) {
    int d1 = 1;
    int d2 = 1;
    bool flag = false;
    while (1) {
        if (x + d1 + d2 <= N && y - d1 >= 1 && y + d2 <= N) {
 
            Divide_Areas(x, y, d1, d2);
            d2++;
            flag = true;
        }
        else if(flag == true){
            d1++;
            d2 = 1;
            flag = false;
        }
        else if (flag == false)
            break;
    }
}
void solve() {
    for (int x = 1; x <= N; x++) {
        for (int y = 2; y <= N - 1; y++) {
            choose_d1_d2(x, y);
        }
    }
}
void input() {
    cin >> N;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            cin >> MAP[i][j];
        }
    }
}
int main() {
    init();
    input();
    solve();
    cout << result << endl;
}
cs

'BAEKJOON ONLINE JUDGE' 카테고리의 다른 글

[백준 5373] 큐빙 (C++)  (0) 2021.08.31
[백준 17406] 배열 돌리기 4 (C++)  (0) 2021.08.30
[백준 1946] 신입 사원 (C++)  (0) 2021.08.28
[백준 1715] 카드 정렬하기 (C++)  (0) 2021.08.27
[백준 1781] 컵라면 (C++)  (0) 2021.08.27

+ Recent posts