본문 바로가기
Problem Solving

[BOJ 15685] 드래곤 커브

by Ladun 2020. 3. 25.

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


[0, 100] 내에서 사각형의 4개의 점이 드래곤 커브의 일부인 사각형의 개수를 찾는 문제이다.

 

드래곤 커브를 모두 그린 다음에 좌표내에 위 조건을 만족하는 사각형이 몇 개 있는지를 확인하면 되는 문제이다.

 

드래곤 커브를 그리는 방법은 

배열에 이전까지의 드래곤 커브의 정보를 저장한 후, 

세대마다 해당 정보로 다음 세대를 만들면 된다.

 

마지막에 0부터 100 사이에 조건을 만족하는 사각형의 개수를 찾으면 된다.


#include <stdio.h>
#include <stdlib.h>

int D[101][101];


void DC(int x, int y, int d, int _g)
{
	int arr[1024];
	int _i = 0;

	D[y][x] = 1;
	arr[_i] = d;
	_i++;
	switch (d)
	{
	case 0:
		x++;
		break;
	case 1:
		y--;
		break;
	case 2:
		x--;
		break;
	case 3:
		y++;
		break;
	}
	D[y][x] = 1;

	for (int g = 0; g < _g; g++)
	{
		int __i = _i;
		for (int i = __i - 1; i >= 0; i--)
		{
			switch ((arr[i] + 1) % 4)
			{
			case 0:
				x++;
				break;
			case 1:
				y--;
				break;
			case 2:
				x--;
				break;
			case 3:
				y++;
				break;
			}
			D[y][x] = 1;
			arr[_i] = (arr[i] + 1) % 4;
			_i++;
		}
	}
	
}

int main()
{
	int N;
	int x, y, d, g;
	int sum = 0; 

	scanf("%d", &N);

	for (int i = 0; i < N; i++)
	{
		scanf("%d %d %d %d", &x, &y, &d, &g);
		DC(x, y, d,g);
	}

	for (int x = 0; x <= 100; x++)
	{
		for (int y = 0; y <= 100; y++)
		{
			int flag = 1;
			for (int i = 0; i < 2; i++)
			{
				for (int j = 0; j < 2; j++)
				{
					if (D[y + j][x + i] != 1)
					{
						flag = 0;
						break;
					}
				}
				if (!flag)
					break;
			}
			if (flag)
				sum++;
		}
	}

	printf("%d", sum);
}

'Problem Solving' 카테고리의 다른 글

[BOJ 2606] 바이러스  (0) 2020.04.07
[BOJ 17144] 미세먼지 안녕!  (0) 2020.03.25
[BOJ 14891] 톱니바퀴  (0) 2020.03.25
[BOJ 2193] 이친수  (0) 2020.01.13
[BOJ 1932] 정수 삼각형  (0) 2020.01.13