일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- c++
- IOS
- 카카오인턴십
- dp
- 분할정복
- 부주상골수술
- DFS
- 코테
- 프로그래머스
- 리눅스
- 스택
- 코딩테스트
- sql
- 독일어
- 독일어독학
- 독학
- 부주상골
- 부주상골증후군
- 롯데정보통신
- istringstream
- 부주상골수술후기
- ChatGPT
- 세브란스
- 백준
- SQLD
- 구현
- BFS
- 카카오인턴
- 카카오코테
- SWIFT
Archives
- Today
- Total
슈뢰딩거의 고등어
[BOJ] 17779 게리맨더링 2 (c++) 본문
https://www.acmicpc.net/problem/17779
단순 구현 문제
어려울 것은 없지만 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