본문 바로가기

Algorithm/시뮬레이션

[백준][15685번][시뮬레이션] 드래곤 커브

드래곤 커브

 

https://www.acmicpc.net/problem/15685

 

 

 

 

<문제>

 

 

 

 

<코드>

#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <deque>

using namespace std;

int n, x, y, d, g; // 동 북 서 남 0 1 2 3
int map[101][101], visit[101][101];

struct location {
	int x, y;
};

deque<location> q;

void initialMap(int arr[101][101])
{
	for (int i = 0; i < 10; i++)
		for (int j = 0; j < 10; j++)
			arr[i][j] = 0;
}

void printMap(int arr[101][101])
{
	printf("\n");
	for (int i = 0; i < 10; i++){
		for (int j = 0; j < 10; j++){
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

void make(int g)
{
	int a, b, c, d, ans=0;
	// 시작점 
	a = q.front().x;
	b = q.front().y;


	while (g--)
	{
		// 끝점
		c = q.back().x;
		d = q.back().y;
		int nc, nd, tc, td;
		for (int i = q.size() - 1; i >= 0; i--)
		{
			// 큐의 모든점들을 c,d를 기준으로 회전시켜준다.
			nc = q[i].x;
			nd = q[i].y;
			tc = nc;
			td = nd;
			nc = td - d;
			nd = c - tc;
			nc += c;
			nd += d;
			// 회전한 점들을 큐에 넣고 map에다가도 표시
			q.push_back({ nc,nd });
			map[nc][nd] = 1;
		}
	}



}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n;
	while (n--) {
		cin >> y >> x >> d >> g;
		// x는 행, y는 열로 사용하자. 받을때만 반대로 받기
		map[x][y] = 1;
		q.push_back({ x,y });

		// 동북서남
		if (d == 0)
		{
			map[x][y + 1] = 1;
			q.push_back({ x,y + 1 });
		}
		else if (d == 1)
		{
			map[x - 1][y] = 1;
			q.push_back({ x - 1,y });
		}
		else if (d == 2)
		{
			map[x][y - 1] = 1;
			q.push_back({ x,y - 1 });
		}
		else
		{
			map[x + 1][y] = 1;
			q.push_back({ x + 1,y });
		}
		make(g);
		//printMap(map);
		//initialMap(map);
		q.clear();
	}

	int ans = 0;
	// 네 꼭지점이 모두 드래곤 커브의 일부인 것의 개수 세기
	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;

}