티스토리 뷰



[SWEA 1953. [모의 SW 역량테스트] 탈주범 검거 URL]

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpLlKAQ4DFAUq&categoryId=AV5PpLlKAQ4DFAUq&categoryType=CODE


이번 문제는 쉬운 BFS문제이지만, 현재 칸에서 다음 칸으로 넘어갈 수 있는지에 대한 조건이 많다.

아래 그림을 보자.

현재 방문한 파이프가 1번이라고 가정해보자. 그럼 1번 파이프에서 방향에 따라 다음 파이프로 이동할 수 있는지,

없는지가 결정된다. 현재 파이프가 1번이고 이동 방향이 동쪽이라고 할 때, 1번 파이프에서 이동할 수 있는 다음

파이프는 1번, 3번, 6번, 7번 파이프가 된다.


이처럼, 현재 파이프와 이동 방향에 따라 이동할 수 있는 다음 파이프인지 확인해주면서 탐색을 진행하면 된다.

[소스 코드]

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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.concurrent.LinkedBlockingDeque;
 
public class Solution {
 
    public static int N, M, R, C, L, tCase, ans;
    public static int[][] map;
    public static boolean[][] visited;
    public static int[] dirX = new int[] { 001-1 }; // 동서남북
    public static int[] dirY = new int[] { 1-100 };
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
    public static void main(String[] args) throws NumberFormatException, IOException {
 
        tCase = Integer.parseInt(br.readLine());
 
        for (int t = 1; t <= tCase; t++) {
 
            StringTokenizer st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());
            R = Integer.parseInt(st.nextToken());
            C = Integer.parseInt(st.nextToken());
            L = Integer.parseInt(st.nextToken());
 
            ans = 0;
            map = new int[N][M];
            visited = new boolean[N][M];
 
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < M; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            bfs();
            System.out.println("#" + t + " " + ans);
        }
    }
 
    public static void bfs() {
 
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(R, C, 0));
        visited[R][C] = true;
 
        while (!q.isEmpty()) {
 
            Node node = q.poll();
            int row = node.row;
            int col = node.col;
            int cnt = node.cnt;
            int curPipe = map[row][col];
 
            if (cnt < L)
                ans += 1;
            else
                continue;
 
            for (int i = 0; i < 4; i++) {
                int nr = row + dirX[i];
                int nc = col + dirY[i];
 
                if (isBoundary(nr, nc) && !visited[nr][nc]) {
                    int nextPipe = map[nr][nc];
                    if (isPossible(curPipe, nextPipe, i)) {
                        visited[nr][nc] = true;
                        q.offer(new Node(nr, nc, cnt + 1));
                    }
                }
            }
        }
    }
 
    public static boolean isPossible(int curPipe, int nextPipe, int dir) {
 
        boolean flag = false;
 
        if (curPipe == 1) {
 
            if (dir == 0) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 6 || nextPipe == 7)
                    flag = true;
            } else if (dir == 1) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 4 || nextPipe == 5)
                    flag = true;
 
            } else if (dir == 2) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 4 || nextPipe == 7)
                    flag = true;
            } else {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 5 || nextPipe == 6)
                    flag = true;
            }
 
        } else if (curPipe == 2) {
 
            if (dir == 2) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 4 || nextPipe == 7)
                    flag = true;
            } else if (dir == 3) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 5 || nextPipe == 6)
                    flag = true;
            }
 
        } else if (curPipe == 3) {
 
            if (dir == 0) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 6 || nextPipe == 7)
                    flag = true;
            } else if (dir == 1) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 4 || nextPipe == 5)
                    flag = true;
            }
 
        } else if (curPipe == 4) {
 
            if (dir == 0) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 6 || nextPipe == 7)
                    flag = true;
            } else if (dir == 3) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 5 || nextPipe == 6)
                    flag = true;
            }
 
        } else if (curPipe == 5) {
 
            if (dir == 0) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 6 || nextPipe == 7)
                    flag = true;
            } else if (dir == 2) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 4 || nextPipe == 7)
                    flag = true;
            }
 
        } else if (curPipe == 6) {
 
            if (dir == 1) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 4 || nextPipe == 5)
                    flag = true;
            } else if (dir == 2) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 4 || nextPipe == 7)
                    flag = true;
            }
 
        } else if (curPipe == 7) {
 
            if (dir == 1) {
                if (nextPipe == 1 || nextPipe == 3 || nextPipe == 4 || nextPipe == 5)
                    flag = true;
            } else if (dir == 3) {
                if (nextPipe == 1 || nextPipe == 2 || nextPipe == 5 || nextPipe == 6)
                    flag = true;
            }
        }
        return flag;
    }
 
    public static boolean isBoundary(int row, int col) {
        return (row >= 0 && row < N) && (col >= 0 && col < M);
    }
 
    public static void showMap(int[][] map) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
}
 
class Node {
    int row;
    int col;
    int cnt;
 
    public Node(int row, int col, int cnt) {
        this.row = row;
        this.col = col;
        this.cnt = cnt;
    }
 
}
 
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함