728x90
시뮬레이션 문제입니다.
N개의 드래곤 커브가 (x,y)좌표에서 D방향으로 G레벨로 있을 때
네 꼭짓점이 드래곤 커브의 일부인 1x1 크기의 정사각형의 개수를 구하는 문제입니다.
다음의 규칙들을 이용해서 문제를 해결했습니다.
드래곤 커브의 N레벨은
드래곤 커브의 N-1레벨과 드래곤 커브의 N-1레벨의 모양을 90도를 한 것을 끝에 붙인 모양입니다.
고로 드래곤 커브는 2^n개의 선분을 가지게 됩니다.
드래곤 커브는 시작지점은 다르지만 결국 패턴은 방향에 따른 4가지 밖에 없습니다.
그래서 4가지 패턴에 대해서 전부 배열에 넣어두고
각 레벨에 따라서 패턴의 횟수를 실행시켜줬습니다.
이렇게 실행시키면서 체크된 (x, y)좌표는 체크를 해두고
모든 실행이 끝났을 때 정사각형인지 체크를 하면 됩니다.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
using namespace std;
bool map[110][110];
int pattern[4][2049];
int quo[11] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };
int change(int num)
{
switch (num) {
case 0:
num = 1;
break;
case 1:
num = 2;
break;
case 2:
num = 3;
break;
case 3:
num = 0;
break;
}
return num;
}
void SetPattern()
{
pattern[0][0] = 0; //우
pattern[1][0] = 1; //상
pattern[2][0] = 2; //좌
pattern[3][0] = 3; //하
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 11; ++j) {
for (int k = 0; k < quo[j]; ++k) {
pattern[i][quo[j] + k] = change(pattern[i][quo[j] - k - 1]);
}
}
}
}
void run(int x, int y, int d, int g)
{
map[y][x] = true;
for (int i = 0; i < quo[g]; ++i) {
switch (pattern[d][i]) {
case 0:
++x;
break;
case 1:
--y;
break;
case 2:
--x;
break;
case 3:
++y;
break;
}
map[y][x] = true;
}
}
void find()
{
int count = 0;
for (int i = 0; i < 101; ++i) {
for (int j = 0; j < 101; ++j) {
if (map[i][j] & map[i + 1][j] & map[i][j + 1] & map[i + 1][j + 1]) {
++count;
}
}
}
cout << count << endl;
}
int main(int argc, char* argv[])
{
memset(map, false, sizeof(map));
SetPattern();
int n;
int x, y, d, g;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> x >> y >> d >> g;
run(x, y, d, g);
}
find();
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 11931번 수 정렬하기 4 (0) | 2020.01.13 |
---|---|
[C++] 백준 17144번 미세먼지 안녕! (0) | 2020.01.04 |
[C++] 백준 1620번 나는야 포켓몬 마스터 이다솜 (1) | 2019.12.10 |
[C++] 백준 10597번 순열장난 (0) | 2019.12.04 |
[C++] 백준 2688번 줄어들지 않아 (0) | 2019.11.29 |