baekjoon

15685번 드래곤 커브

gokimkh 2022. 4. 1. 16:54

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

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

구현 문제이다. 먼저 예시를 보면 규칙이 있다.

0세대 0

1 세대 01

2세대 01/21

3세대 0121/2321

 

0세대를 뒤집고 + 1 씩 하면 1세대고 1세대를 뒤집고 + 1씩 해주면 2세대가 된다. 이런 형태로 문제를 구현하면 된다.

 

#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<int>
#define F first
#define S second
using namespace std;

bool board[101][101];
int st,en;
int dx[4] = {0,-1,0,1},dy[4] = {1,0,-1,0};

void solve(vc &dir){
    int size = int(dir.size());

    for(int i=size-1;i>=0;i--){
        int next = (dir[i] + 1) % 4;

        st += dx[next], en += dy[next];
        board[st][en] = true;
        dir.push_back(next);
    }
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    int n, x, y, d, g, ans = 0;

    cin >> n;
    while(n--){
        cin >> y >> x >> d >> g;

        vc dir;

        st = x + dx[d], en = y + dy[d];
        board[st][en] = board[x][y] = true;

        dir.push_back(d);

        for(int i=0;i<g;i++)
            solve(dir);
    }

    for(int i=0;i<=99;i++){
        for(int j=0;j<=99;j++)
            if(board[i][j] && board[i+1][j] && board[i][j+1] && board[i+1][j+1]) ans++;
    }

    cout << ans;
}