알고리즘/백준

백준 15685 드래곤 커브

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

유형: 시뮬레이션

  • 방향의 규칙성을 먼저 찾는다.
  • 시작점에서 벡터의 정보대로 드레곤 커브를 완성한다
  • map에 1로 업데이트 한다
  • 주어진 입력값을 다 구한 다음 map에 1이 몇개 있는지 세어본다

가장 중요한 코드는 아래 코드 이다. 방향 벡터의 끝에서 부터 0까지 탐색한다.

for (int j = dir.size() - 1; j >= 0; j--)
{
	dir.push_back((dir[j] + 1) % 4);
}

 

 

※ 전체코드

/*
	0세대 동
	1세대 동북
	2세대 동북서북
	3세대 동북서북서남서북
	방향을 먼저 구한뒤 그것 대로 시작점에서 순서대로 한다

	0동 1북 2서 3남
	100*100 행렬에서 커브를 구한 뒤 1로 초기화
	true의 1의 갯수를 찾는다

	main
		입력
		처음 방향은 먼저 push
	sol
		세대수-1
		while(세대수--)
			for 끝에서 0까지

			구한 벡터배열 대로 입력좌표에서 시작

*/
#include<iostream>
#include<vector>
using namespace std;
int N;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,-1,0,1 };
int map[101][101];
int ans;
void sol(int x,int y,int d,int g)
{
	vector<int> dir;
	dir.push_back(d);
	for (int i = 0; i < g; i++)//세대수
	{
		for (int j = dir.size() - 1; j >= 0; j--)
		{
			dir.push_back((dir[j] + 1) % 4);
		}
	}
	int ny = y;
	int nx = x;
	map[ny][nx] = 1;
	for (int i = 0; i < dir.size(); i++)//1로 업데이트
	{
		ny += dy[dir[i]];
		nx += dx[dir[i]];
		map[ny][nx] = 1;
	}
}
int main() {
	cin >> N;
	for (int i = 0; i < N; i++) 
	{
		int x, y, d, g;
		cin >> x >> y >> d >> g;
		sol(x, y, d, g);	
	}
	for (int i = 0; i < 100; i++)
	{
		for (int j = 0; j < 100; j++)
		{
			if (map[i][j] && map[i + 1][j] && map[i][j + 1] && map[i + 1][j + 1])
			{
				ans++;
			}
		}
	}
	cout << ans;
}

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

백준 16234 인구 이동  (0) 2020.03.13
백준 15686 치킨 배달  (0) 2020.03.13
15684 사다리 조작  (0) 2020.03.13
15683 감시  (0) 2020.03.12
14891번 톱니바퀴  (0) 2020.03.12