본문 바로가기

ProgramSoliving

백준 : 5213 JAVA

반응형

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

 

5213번: 과외맨

문제 과외맨은 평소에 서강대학교 학생 이민혁으로 위장하고 있는 한국의 대표적인 영웅이다. 그는 슈퍼 히어로가 너무 미국에 집중되어 있는 현실을 안타까워했고, 그의 절친한 친구인 스파이더맨과 아이언맨에게 한국으로 와서 같이 영웅 활동을 하자는 제안을 했으나 거절당했다. 얼마 전, 오랜 잠에서 깨어난 고대 마야인들이 과외맨이 수업을 듣는 동안 과외 노트를 훔쳐갔다. 과외맨은 빼앗긴 노트를 찾아오기 위해 인천 공항으로 가서 과테말라로 가는 비행기를 탔다. 일단

www.acmicpc.net

문제를 푸는데 작은 부분에서 많이 해매었던 문제다.

도미노 판을 표시하는 Map과 각각의 도미노의 번호를 표시하는 맵을 만들면된다.

물론 도미노의 크기는 1*2 크기이므로 Map도 Map[N][N*2] 가 만들어져야한다.

받을 때는 홀수와 짝수행에 신경을 써야한다. 그러면 지그재그로는 어떻게 놔둘것인가 ??

0이라는 값은 비어잇는 공간처럼 사용하면된다 마침 도미노의 크기는 1부터 시작된다.

이렇게 놔두면 BFS를 이용해서 사방 탐색을 할수가 있다.

여기서 내가 생각을 짧게한 실수는 봐로 운선위큐를 활용해서 Cnt 움직인 횟수에 간한 값을 q에 넣어주면

만약 1이라는 도미노는 left right로 구분된다.  이때 q에 left만 들어와잇을 때 right로 가는 값은 경로에 표시하면 안된다. 나는 우선순위 큐를 사용하면 left 큐를 처리하고 right큐를 바로처리한다고 차각햇다 .. 

하지만 right큐는 다른 q를 처리하고 오는 경우가 있으므로 경로가 이상하게 쌓일수가 있다.

따라서 도미노는 하나의 큐에 두값을 동시에 넣어야 된다.

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
public class B5213 {
    static int N;
    static int E;
    static int map[][];
    static int p[][];
    static int rought[];
 
    static int dy[] = { 1-100 };
    static int dx[] = { 001-1 };
 
    static class Pair {
        int y;
        int x;
 
        public Pair(int y, int x) {
            super();
            this.y = y;
            this.x = x;
        }
    }
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        N = Integer.parseInt(br.readLine());
        map = new int[N][N * 2];
        p = new int[N][N * 2];
        rought = new int[N * N - N / 2 + 1];
        int num = 1;
        int start = 0;
        for (int i = 0; i < N; i++) {
            int e = i % 2 == 0 ? N : N - 1;
            int j = i % 2 == 0 ? 0 : 1;
 
            for (int ee = 0; ee < e; ee++) {
                st = new StringTokenizer(br.readLine());
                p[i][j] = num;
                map[i][j++= Integer.parseInt(st.nextToken());
                p[i][j] = num++;
                map[i][j++= Integer.parseInt(st.nextToken());
 
            }
        }
 
        boolean visit[][] = new boolean[N][N * 2];
        Queue<Pair> q = new LinkedList<>();
        q.add(new Pair(00));
        q.add(new Pair(01));
        visit[0][0= true;
        visit[0][1= true;
 
        while (!q.isEmpty()) {
            Pair cur = q.poll();
            if (p[cur.y][cur.x] > start) {
                start = p[cur.y][cur.x];
            }
 
            if (cur.y == N - 1 && cur.x == N * 2 - 2) {
                break;
            }
 
            int y = cur.y;
            int x = cur.x;
            for (int d = 0; d < 4; d++) {
                int ny = y + dy[d];
                int nx = x + dx[d];
                if (ny < 0 || nx < 0 || ny >= N || nx >= N * 2)
                    continue;
                if (visit[ny][nx])
                    continue;
                if (p[ny][nx] == 0)
                    continue;
                if (map[y][x] != map[ny][nx])
                    continue;
                int nnx = 0;
                if (ny % 2 == 0) {
                    if (nx % 2 == 0) {
                        nnx = nx + 1;
                    } else {
                        nnx = nx - 1;
                    }
                } else {
                    if (nx % 2 == 0) {
                        nnx = nx - 1;
                    } else {
                        nnx = nx + 1;
                    }
                }
 
                visit[ny][nx] = true;
                visit[ny][nnx] = true;
                q.add(new Pair(ny,nnx));
                q.add(new Pair(ny, nx));
 
                rought[p[ny][nx]] = p[y][x];
            }
 
        }
 
        Stack<Integer> stack = new Stack<Integer>();
 
        stack.add(start);
        while (start != 1) {
            start = rought[start];
            stack.add(start);
        }
        StringBuilder sb = new StringBuilder();
        sb.append(stack.size()).append('\n');
 
        sb.append(stack.pop());
        while (!stack.isEmpty()) {
            sb.append(' ').append(stack.pop());
        }
 
        System.out.print(sb.toString());
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 10775  (0) 2020.04.15
백준 : 1637  (0) 2020.04.15
백준 : 12886  (0) 2020.03.15
백준 : 1086 JAVA  (0) 2020.03.14
백준 : 16946  (0) 2020.03.11