Problem Solving/BOJ
[BOJ] #15685 _ 드래곤 커브
Grini
2019. 10. 22. 19:28
[드래곤 커브] https://www.acmicpc.net/problem/15685
15685번: 드래곤 커브
첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다. (0 ≤ x, y ≤ 100, 0 ≤ d ≤ 3, 0 ≤ g ≤ 10) 입력으로 주어지는 드래곤 커브는 격자 밖으로 벗어나지 않는다. 드래곤 커브는 서로 겹칠 수 있다. 방향은 0, 1, 2,
www.acmicpc.net
끝점을 기준으로 90도로 시계 방향 회전 시키면 값이 어떻게 바뀌는지 규칙을 찾아보았다.
끝점을 기준으로
- y값이 1감소하면, x값이 1감소한다.
- x값이 1증가하면, y값이 1감소한다.
새로운 좌표 x값 = 끝 점의 x좌표 + (끝 점 y좌표 - 과거 y좌표)
새로운 좌표 y값 = 끝 점의 y좌표 - (끝 점 x좌표 - 과거 x좌표)
# 예시
새로운 좌표 : (0, -1), 끝 점 : (1, -1), 과거 좌표 : (1, 0)
0 = 1 + (-1 - 0)
-1 = -1 - (1 - 1)
알아낸 규칙을 바탕으로 코드를 구현하였다.
curv 벡터에는 원래 드래곤 커브의 좌표 값을 저장하고, n_curv에는 새롭게 생길 드래곤 커브의 값을 저장한다.
모든 드래곤 커브의 좌표를 구한 후,
배열에 1로 표시하고, 사각형 모양으로 드래곤 커브를 확인하여 갯수를 세주는 방식으로 구현하였다.
[ 소스 코드 ]
#include <cstdio>
#include <vector>
#include <algorithm>
#define MAX 101
using namespace std;
int dx[] = { 1,0,-1,0 }, dy[] = { 0,-1,0,1 };
bool map[MAX][MAX];
void setDragonCurve(int x, int y, int d, int g);
int cntSquare();
int main() {
int n;
scanf("%d", &n);
while (n--) {
int x, y, d, g;
scanf("%d %d %d %d", &x, &y, &d, &g);
setDragonCurve(x, y, d, g);
}
printf("%d\n", cntSquare());
return 0;
}
void setDragonCurve(int x, int y, int d, int g) {
vector<pair<int, int> > curve;
curve.push_back(make_pair(x, y));
map[y][x] = 1;
curve.push_back(make_pair(x + dx[d], y + dy[d]));
map[y + dy[d]][x + dx[d]] = 1;
while (g--) {
int end_point = curve.size() - 1;
int tmp_x = curve[end_point].first, tmp_y = curve[end_point].second;
int dist_x, dist_y;
while (end_point > 0) {
dist_x = curve[end_point].first - curve[end_point - 1].first;
dist_y = curve[end_point].second - curve[end_point - 1].second;
tmp_x += dist_y;
tmp_y -= dist_x;
curve.push_back(make_pair(tmp_x, tmp_y));
map[tmp_y][tmp_x] = 1;
end_point--;
}
}
}
int cntSquare() {
int result = 0;
for (int i = 0; i < MAX-1; i++) {
for (int j = 0; j < MAX-1; j++) {
if (!map[i][j]) continue;
if (!map[i + 1][j]) continue;
if (!map[i][j + 1]) continue;
if (!map[i + 1][j + 1]) continue;
result++;
}
}
return result;
}