문제 링크: https://www.acmicpc.net/problem/15685

 

구현 문제입니다. 드래곤커브를 만들어지는 규칙을 찾는 게 중요합니다.

 

3세대 드래곤 커브

드래곤 커브를 시작점부터 이동 방향에 따라 나타내보면 아래와 같습니다 

  • 0세대: 0
  • 1세대: 01
  • 2세대: 0121
  • 3세대: 01212321
  • 4세대: 0121232123032321
  • 5세대: 01212321230323212303010323032321
  • ...

다음 세대로 갈 때, 전 세대의 경로를 역순으로 돌면서 \((x+1)\%4\) 한 값을 써주시면 됩니다. 0, 1, 2, 3 순으로 방향이 90도씩 반시계방향으로 가니, 90도를 회전한 값은 +1이 되겠죠. 4가 됐을 때 0이 되도록 모듈러 연산 해주시고요.

사실 원리만 알면 쉽습니다. 잘 떠오르지가 않아서 문제지..

 

\[
\begin{pmatrix}
x'\\y' 
\end{pmatrix}
=
\begin{pmatrix}
\cos \theta & - \sin \theta \\ 
\sin \theta & \cos \theta
\end{pmatrix}
\begin{pmatrix}
x \\
y
\end{pmatrix}
\]

저는 처음에 각 점의 좌표를 90도 회전해서 풀려고 했는데 공식도 잘 기억이 안나고 해서 출제자 의도대로(?) 풀었습니다. 회전 변환 하실 분은 위 공식 참고하시면 됩니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

using namespace std;


struct Dir {
  int y, x;
};

Dir DIR[4] = { {0,1},{-1,0},{0,-1},{1,0} };


int n;
bool visited[101][101];
vector<vector<int>> dragon_curves[4];


int main(int argc, char** argv)
{
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
#endif

  ios_base::sync_with_stdio(false);
  cin.tie(NULL);


  // 드래곤커브 만들기
  for (int d = 0; d < 4; ++d) {
    dragon_curves[d].push_back({ d });
    for (int i = 0; i < 10; ++i) {
      const vector<int>& prev_dragon = dragon_curves[d].back();
      vector<int> next_dragon = dragon_curves[d].back();

      for (auto it = prev_dragon.crbegin(); it != prev_dragon.crend(); ++it)
        next_dragon.push_back((*it + 1) % 4);
      dragon_curves[d].push_back(next_dragon);
    }
  }



  cin >> n;
  int x, y, d, g;
  for (int i = 0; i < n; ++i) {
    cin >> x >> y >> d >> g;
    visited[y][x] = true;
    const vector<int>& curve = dragon_curves[d][g];

    for (auto it = curve.cbegin(); it != curve.cend(); ++it) {
      y += DIR[*it].y;
      x += DIR[*it].x;

      visited[y][x] = true;
    }
  }

  int res = 0;
  for (int i = 0; i < 100; ++i)
    for (int j = 0; j < 100; ++j)
      if (visited[i][j] && visited[i][j + 1] && visited[i + 1][j] && visited[i + 1][j + 1])
        ++res;

  cout << res;
  

  return 0;
}

저는 0~10세대까지의 드래곤 커브 경로를 시작 방향별로 다 만들어놓고 사용했습니다.

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 1199: 오일러 회로  (0) 2020.04.04
[백준][C++] 15686: 치킨 배달  (0) 2020.03.31
[백준][C++] 15685: 드래곤 커브  (0) 2020.03.28
[백준][C++] 14500: 테트로미노  (0) 2020.03.26
[백준][C++] 3190: 뱀  (0) 2020.03.26
[백준][C++] 2615: 오목  (2) 2020.03.26