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 |