문제 >> [BOJ] 15685. 드래곤 커브



전형적인 시뮬레이션 문제.


방향의 규칙에 대해서 생각해보며 풀었습니다. 


→  ↑ ← ↓  순서로 드래곤커브가 진행된다는 것을 발견하였고, 순서대로 배열에 넣어 인덱스를 활용해 방향을 전환했습니다.



문제에서 주어진 예시를 보면 ,


시작 방향이 오른쪽 일때,


0세대 

 →  


1세대

 →   ↑ 


2세대

 →   ↑ ← ↑


3세대

 →   ↑ ← ↑ ← ↓ ←  ↑


순서로 진행하고 있고, 이들의 규칙은 다음과 같습니다.


1. 이전 세대의 방향들은 LILF로 팝한다.


2. 방향을 회전해서 진행하여 상단에 push하고 원래의 방향을 하단에 add한다.


예시 )


1세대

 →   ↑ 


nowQ : (상) ↑   → (하) 


LILF로 pop


  ↑   회전 후 ==> ← 


(회전된 방향을 상단에 푸시, 원래방향 하단에 애드)

nextQ : (상)   ←  ↑   (하) 


-----------------------------------


nowQ : (상)  → (하) 


LILF로 pop


   →  회전 후 ==> ↑ 


(회전된 방향을 상단에 푸시, 원래방향 하단에 애드)

nextQ : (상)   ↑  ←  ↑ →  (하) 


-----------------------------------

상단부터 팝하면 2세대가 완성되는 것을 확인할 수 있습니다.


2세대

 →   ↑ ← ↑



설명처럼 상단과 하단 모두에 삽입 하기 위해 덱을 사용해 구현했습니다.




<<java>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
 
//BOJ :: 15685 드래곤커브
//2019-04-08
public class Main {
    static int[] dy = { 0-101 };
    static int[] dx = { 10-10 }; // 오 상 왼 하
    private static boolean[][] map;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // 드래곤 커브의 개수
        map = new boolean[103][103];
        StringTokenizer st;
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            int d = Integer.parseInt(st.nextToken());
            int g = Integer.parseInt(st.nextToken());
 
            bfs(x, y, d, g);
        }
 
        
        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]) {
                //    System.out.println(i+" "+j);
                    ans++;
                }
            }
        }
        System.out.println(ans);
 
    }
 
    public static void bfs(int x, int y, int d, int generation) {
        Deque<Integer> now = new LinkedList<>();
 
        Deque<Integer> next = new LinkedList<>();
        map[y][x]=true;
        int ny = y+dy[d];
        int nx = x+dx[d];
        if(ny<0 || ny>100 || nx<0 || ny>100return;
        map[ny][nx]=true;
        y=ny;
        x=nx;
        now.add(getNextdir(d));
        if(generation==0return;
        int g = 0;
        while (!now.isEmpty()) {
            g++;
            int size = now.size();
 
                for(int i=0;i<size;i++) {
                    int dir = now.pop();
                    ny = y+dy[dir];
                    nx = x+dx[dir];
                    if(ny<0 || ny>100 || nx<0 || ny>100break;
                    
                    map[ny][nx] = true;
                    
                    int nd = getNextdir(dir);
                    
                    next.push(nd);
                    next.add(dir);
                    y=ny;
                    x=nx;
            }
 
            if(g==generation) return;
            now.clear();
            now = new LinkedList<>(next);
            next.clear();
//            y=ny;
//            x=nx;
        }
 
    }
    public static int getNextdir(int d) {
        if(d==3return 0;
        else return d+1;
    }
 
    static class pair {
        int y;
        int x;
        int dir;
 
        public pair(int y, int x, int dir) {
            super();
            this.y = y;
            this.x = x;
            this.dir = dir;
        }
    }
}
 
cs




<<C++>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <queue>
#include <deque>
using namespace std;
 
int n,generation;
int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0};
bool map[101][101= {false};
deque<int> dq;
 
void dragon_curve(int nx,int ny, int g){
    
    queue<int> q;
    
    if(g == generation) return;
    
    int dq_size = dq.size();
    
    for(int i=0;i<dq_size;i++){
        int a = dq.front();
        dq.pop_front();
        q.push(a);
    }
    
    for(int i=0;i<dq_size;i++){
        int d = q.front();
        q.pop();
        dq.push_back(d);
        
        int nd = (d+1)%4;
        
        nx += dx[nd];
        ny += dy[nd];
        
        if(nx <0 || nx >100 || ny<0 || ny>100continue;
        
        map[nx][ny]= true;
        dq.push_front(nd);
    }
    
    dragon_curve(nx,ny,g+1);
}
 
void count_box(){
    int cnt = 0;
   
    for(int i=0;i<=99;i++){
        for(int j=1;j<=100;j++){
            if(map[i][j] && map[i][j-1&& map[i+1][j] && map[i+1][j-1])
                cnt++;
        }
    }
    printf("%d\n", cnt);
}
 
int main(){
    scanf("%d",&n);
    
    int x,y,d;
    for(int i=0;i<n;i++){
        scanf("%d %d %d %d",&y,&x,&d,&generation);
        while(!dq.empty()) dq.pop_front();
        
        map[x][y] = true;
        x += dx[d];
        y += dy[d];
        map[x][y] = true;
        dq.push_front(d);
        
        dragon_curve(x,y,0);
    }
    
    count_box();
    
    return 0;
}
 
cs


'Algorithm Problem Solving' 카테고리의 다른 글

[BOJ] 16236 : 아기상어  (0) 2019.06.05
[BOJ] 16235 : 나무재테크  (1) 2019.04.13
[BOJ] 1938 통나무 옮기기  (0) 2019.04.05
[SWEA] 2383. 점심식사 시간  (5) 2019.04.04
[SWEA] 1949. 등산로 조성  (0) 2019.04.01

+ Recent posts