Recent Posts
Recent Comments
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

일상의 기록

백준 15685번 - 드래곤 커브 본문

Algorithm

백준 15685번 - 드래곤 커브

Miguel Lee 2019. 4. 12. 02:20

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

 

처음엔 도통 어떻게 풀어야 하는지 감이 오질 않았다.

고민하던 중 힌트를 얻으려고 검색을 했는데, 단순히 손으로 모양을 그리기만 했지 뻗어나가는 방향의 규칙성을 생각하지 못했다.

 

*이번 세대에서의 curve는 저번 세대까지의 curve 방향 역순과 관련이 있다*

 

#include<iostream>
#include<vector>

using namespace std;

//2차원 좌표평면을 벡터로 만들고, 모든 공간을 0으로 초기화한다.
//드래곤 커브의 시작점을 기준으로, 드래곤 커브를 따라 위에서 만돈 좌표평면의 값을 1로 바꿔준다.
//드래곤 커브의 생성이 끝나면, 사각형을 세는 함수를 사용해 좌상단 끝점을 시작으로 우하단 끝점까지 (x,y)(x+1,y)(x+1, y+1)(x, y+1)이 모두 1인 것이 몇 개나 있는지 카운트한다.

/*
d 값이 의미하는 바

0: x좌표가 증가하는 방향 (→)
1: y좌표가 감소하는 방향 (↑)
2: x좌표가 감소하는 방향 (←)
3: y좌표가 증가하는 방향 (↓)
*/

struct dragon {
	int x;
	int y;
	int d;
	int g;
};

vector<vector<int>> map(101, vector<int>(101, 0)); // 100*100 맵
vector<dragon> dragonCurve;
int square = 0;
int n;
int x, y, d, g;

void countSquare() {
	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++) {
			if (map[i][j] == 1 && map[i + 1][j] == 1 && map[i][j + 1] == 1 && map[i + 1][j + 1] == 1) {
				square++;
			}
		}
	}
	return;
}

void drawDragon(int count) {
	
	if (count == n) {
		countSquare();
		return;
	}

	int gen = dragonCurve[count].g;

	vector<int> draw;

	int xx = dragonCurve[count].x;
	int yy = dragonCurve[count].y;

	draw.push_back(dragonCurve[count].d); // 최초 방향 push. 0세대의 경우를 말함

	map[yy][xx] = 1; // 최초 시작점을 1로 만듦
	
	for (int i = 0; i < gen; i++) {
		vector<int> temp;
		for (int j = draw.size()-1; j >= 0; j--) { // draw의 갯수만큼 역방향 반복
			if (draw[j] != 3) {
				temp.push_back(draw[j] + 1);
			}
			else {
				temp.push_back(0);
			}
		}
		
		for (int k = 0; k < temp.size(); k++) {
			draw.push_back(temp[k]);
		}
		
	}
	
	for (int i = 0; i < draw.size(); i++) {
		if (draw[i] == 0) {
			xx++;
			map[yy][xx] = 1;
		}
		else if (draw[i] == 1) {
			yy--;
			map[yy][xx] = 1;
		}
		else if (draw[i] == 2) {
			xx--;
			map[yy][xx] = 1;
		}
		else if (draw[i] == 3) {
			yy++;
			map[yy][xx] = 1;
		}
	}

	drawDragon(count + 1);
}



int main() {

	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> x >> y >> d >> g;
		dragonCurve.push_back({ x, y, d, g });
	}

	drawDragon(0);

	cout << square;
	return 0;

}

'Algorithm' 카테고리의 다른 글

백준 15684 - 사다리 조작  (0) 2019.04.11
백준 14891 - 톱니바퀴  (0) 2019.04.07
백준 14888 - 연산자 끼워넣기  (0) 2019.04.06
백준 14503 - 로봇 청소기  (0) 2019.04.06
백준 14501 - 퇴사  (0) 2019.04.06