어흥

[백준 15685] 드래곤 커브 (C++) 본문

알고리즘/백준

[백준 15685] 드래곤 커브 (C++)

라이언납시오 2020. 3. 13. 15:10
728x90
반응형

문제 링크: 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

1. 주의할 점

- 회전행렬을 진행하지만 Y값이 위로 가면 -1, 아래로 가면 +1이 되므로 기존의 회전행렬과 다르다.

기존:   0 1  이 문제:    0 -1

        -1 0                1  0

- 점이 가로 세로 최대 100개씩이므로 배열의 범위는 101까지여야한다

 

2. 구현

- 입력받은 드래곤 커브의 세대가 0이면 점 1개이므로 해당 배열의 boolean값을 true로 바꾸고 끝낸다.

- 나머지 드래곤 커브의 경우 Rotate()함수를 통해 Vector의 끝부분에 추가되는 원소들을 넣는다.

- Find_square()함수를 통해 정사각형을 몇개 이룰 수 있는지 확인한다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int result = 0, row, col;
int dx[3] = { 0,1,1 };
int dy[3] = { 1,0,1 };
bool check[101][101] = { false, };
int generation[20];

struct info {
	int x, y;
};
info tmp;
vector<info> v[20];		//드래곤커브

void find_square() {		//답 구하는 함수
	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++) {
			if (check[i][j]) {
				bool avail = true;
				for (int k = 0; k < 3; k++) {
					int nx = j + dx[k];
					int ny = i + dy[k];
					if (!check[ny][nx]) {
						avail = false;
						break;
					}
				}
				if (avail) result++;
			}
		}
	}
}

void rotate(int idx) {
	vector<info> dup;
	dup = v[idx];
	int dist_x = dup[dup.size() - 1].x;
	int dist_y = dup[dup.size() - 1].y;
	for (int i = v[idx].size() - 2; i >= 0; i--) {
		v[idx][i].x -= dist_x;
		v[idx][i].y -= dist_y;

		int next_x = -v[idx][i].y;
		int next_y = v[idx][i].x;

		next_x += dist_x;
		next_y += dist_y;
		tmp.x = next_x;
		tmp.y = next_y;
		check[next_y][next_x] = true;
		dup.push_back(tmp);
	}
	v[idx].clear();
	v[idx] = dup;
}

int main() {
	int num, x, y, dir, gen;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> x >> y >> dir >> gen;
		tmp.x = x;
		tmp.y = y;
		v[i].push_back(tmp);
		generation[i] = gen;
		check[y][x] = true;
		if (dir == 0) {			//우
			tmp.x = x + 1;
			tmp.y = y;
		}
		else if (dir == 1) {		//상
			tmp.x = x;
			tmp.y = y - 1;
		}
		else if (dir == 2) {		//좌
			tmp.x = x - 1;
			tmp.y = y;
		}
		else {			//하
			tmp.x = x;
			tmp.y = y + 1;
		}
		check[tmp.y][tmp.x] = true;
		v[i].push_back(tmp);		
	}
	for (int i = 0; i < num; i++) {
		int g = generation[i];
		if (g ==0) continue;
		else {
			while (g > 0) {		//회전
				rotate(i);		
				g--;
			}
		}
	}
	find_square();
	cout << result;
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1309] 동물원 (C++)  (0) 2020.03.13
[백준 13459] 구슬 탈출 (C++)  (0) 2020.03.13
[백준 1948] 임계경로 (C++)  (0) 2020.03.13
[백준 2623] 음악프로그램 (C++)  (0) 2020.03.12
[백준 6118] 숨바꼭질 (C++)  (0) 2020.03.12
Comments