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;
}