Algorithm/백준

[백준][15685번] 드래곤 커브

1일1코딩 2020. 4. 28. 22:10

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. 주어진 입력에 드래곤커브에 따라 map에 라인을 그려주었다. (Stack 구조가 이용됨)

 

2. 처음 시작 위치에서 방향만을 벡터에 저장했다. 스택과 같이 뒤에서 부터 저장 된 방향을 이용하면

이전 세대 드래곤커브를 시계방향으로 돌려 마지막에 붙인 효과를 볼 수 있다.

 

 

소스코드

더보기
#include<stdio.h>
#include<vector>
using namespace std;
int map[101][101];

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

int N, answer = 0;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,-1,0,1 };
vector<drg> info;

int getClockWiseDir(int n)
{
	switch (n) {
	case 0: return 1;
	case 1: return 2;
	case 2: return 3;
	case 3: return 0;
	}
}

void dragonCurve(int num)
{
	vector<int> dir;
	//0세대
	dir.push_back(info[num].d);
	int x = info[num].x, y = info[num].y;
	map[y][x] = 1;
	x += dx[info[num].d];
	y += dy[info[num].d];
	for (int i = 1; i <= info[num].g; i++) {
		for (int j = dir.size(); j > 0; j--) {
			map[y][x] = 1;
			int nextDir = getClockWiseDir(dir[j-1]);
			dir.push_back(nextDir);
			x += dx[nextDir];
			y += dy[nextDir];
			if (x < 0 || y < 0 || x > 100 || y > 100) return;
		}	
	}
	if (x < 0 || y < 0 || x > 100 || y > 100) return;
	map[y][x] = 1;
}

bool checkDragonCurve(int y, int x) {
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 2; j++) {
			int nx = x + j;
			int ny = y + i;
			if (nx < 0 || ny < 0 || nx > 100 || ny > 100) return false;
			if (map[ny][nx] == 0) return false;
		}
	}
	return true;
}

void solution()
{
	for (int i = 0; i < info.size(); i++) {
		dragonCurve(i);
	}

	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++) {
			if (map[i][j] == 0) continue;
			if (checkDragonCurve(i, j)) {
				answer++;
			}
		}
	}
}

int main()
{
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		int x, y, d, g;
		scanf("%d %d %d %d", &x, &y, &d, &g);
		drg tmp = { x,y,d,g };
		info.push_back(tmp);
	}
	solution();
	printf("%d\n", answer);
}

 

결과