-
금강석 - 2496Algorithm/BOJ 2020. 3. 19. 15:0612345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273//2496 - 금강석#include <iostream>#include <queue>using namespace std;int N, M, T, K;int X[100], Y[100];int convertX(int x, int y){return x - y;}int convertY(int x, int y){return x + y;}void init(){cin >> N >> M >> T >> K;int x, y;for (int i = 0; i < T; ++i){cin >> x >> y;X[i] = convertX(x, y);Y[i] = convertY(x, y);}}int main(){init();int x, y;int num, ans = 0, ansX, ansY;queue<int> xQ, yQ;for (int i = 0; i < T; ++i)for (int j = 0; j < T; ++j){x = X[i];y = Y[j];if ((x + y) % 2){xQ.push(x), xQ.push(x), xQ.push(x - 1), xQ.push(x + 1);yQ.push(y + 1), yQ.push(y - 1), yQ.push(y), yQ.push(y);}elsexQ.push(x), yQ.push(y);while (!xQ.empty()){num = 0;x = xQ.front(), xQ.pop();y = yQ.front(), yQ.pop();int u = y-x;if (x + y + K > 2 * N)x = N - u/2 - K/2, y = N + u/2 - K/2;for (int k = 0; k < T; ++k)if (X[k] >= x && X[k] <= x + K && Y[k] >= y && Y[k] <= y + K)++num;if (ans < num){ans = num;ansX = x + K / 2;ansY = y + K / 2;}}}cout << (ansX + ansY) / 2 << " " << (ansY - ansX) / 2 << "\n";cout << ans;}
cs https://www.acmicpc.net/problem/2496
2496번: 금강석
첫째 줄에 4개의 정수 N, M, T, K가 빈칸을 사이에 두고 주어진다. N은 지도의 너비를 나타내고, M은 지도의 높이를 나타낸다(1 ≤ N, M ≤ 1,000,000). T는 금강석의 개수를 나타내고, K는 D-사각형의 크기(대각선의 길이)를 나타낸다, T는 1 이상 100 이하의 정수이고, K는 2 이상 10,000,000 이하의 짝수이다. 둘째 줄부터 T개의 줄에는 각 줄마다 두 개의 정수 A와 B가 빈칸을 사이에 두고 주어진다. 여기서 (A,
www.acmicpc.net
금강석
https://onedaycoding.tistory.com/127문제의 응용버전입니다.
이 문제의 좌표계를 (0, 0)을 기준으로 반시계 방향으로 45도 회전시켜주고, 금강석이 밑변과 왼쪽 변에 포함되는 사각형안을 탐색하도록 했습니다.
이때 주의해야할 점이 탐색하는 사각형의 꼭지점이 원래 좌표계에서 정수가 아닌 경우가 나올수도 있습니다. 이 경우엔 그 근처 4개의 점들을 모두 탐색하도록 하였습니다.
'Algorithm > BOJ' 카테고리의 다른 글
가운데를 말해요 - 1655 (0) 2020.03.19 교환 - 1039 (0) 2020.03.19 보석 - 2492 (0) 2020.03.19 게임 - 1103 (0) 2020.03.16 PLAYERJINAH’S BOTTLEGROUNDS - 15803 (0) 2020.03.16