본문 바로가기

ProgramSoliving

백준 : 9328

반응형

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

 

9328번: 열쇠

문제 상근이는 1층 빌딩에 침입해 매우 중요한 문서를 훔쳐오려고 한다. 상근이가 가지고 있는 평면도에는 문서의 위치가 모두 나타나 있다. 빌딩의 문은 모두 잠겨있기 때문에, 문을 열려면 열쇠가 필요하다. 상근이는 일부 열쇠를 이미 가지고 있고, 일부 열쇠는 빌딩의 바닥에 놓여져 있다. 상근이가 훔칠 수 있는 문서의 최대 개수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 수는 100개를 넘지 않는다. 각

www.acmicpc.net

얼마나 많은 보물을 찾을수 있는지 찾는 문제이다.

문제는 BFS탐색을하면서 열쇠를 먹을때마다 다시한번더 BFS를 탐색 해야하는 문제이다.

열쇠인 지점을 먹으면 그지점부터 다시 Queue를 초기화 한다음 다시돌린다.

이렇게해서 visit[][] 배열이 더이상 움직일수 없을때까지 돌리면 정답이다.
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
 
public class B9328 {
    static int T;
    static int N, M;
    static char map[][];
    static int dy[] = { 1-100 };
    static int dx[] = { 001-1 };
 
    static class Sang {
        int y;
        int x;
 
        public Sang(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));
 
        T = Integer.parseInt(br.readLine());
 
        for (int t = 1; t <= T; t++) {
            String str[] = br.readLine().split(" ");
 
            N = Integer.parseInt(str[0]);
            M = Integer.parseInt(str[1]);
 
            map = new char[N + 2][M + 2];
            char[] c = null;
            for (int i = 0; i <= N + 1; i++) {
                if (i >= 1 && i <= N) {
                    c = br.readLine().toCharArray();
                }
                for (int j = 0; j <= M + 1; j++) {
                    if (i == 0 || i == N + 1 || j == 0 || j == M + 1) {
                        map[i][j] = '.';
                    } else {
                        map[i][j] = c[j - 1];
                    }
                }
            }
 
            boolean visit[][] = new boolean[N+2][M+2];
            boolean check[] = new boolean[30];
 
            c = br.readLine().toCharArray();
    
            if (c[0!= '0') {
                for (int i = 0; i < c.length; i++) {
                    check[c[i] - 'a'= true;
                }
            }
 
            Queue<Sang> q = new LinkedList<>();
            boolean marking[][] = new boolean[N + 2][M + 2];
            visit[0][0=true;
            q.add(new Sang(00));
 
            int Answer = 0;
 
            while (!q.isEmpty()) {
                Sang tmp = q.poll();
                if (map[tmp.y][tmp.x] == '$' && !marking[tmp.y][tmp.x]) {
                    Answer++;
                    marking[tmp.y][tmp.x] = true;
                }
 
                for (int d = 0; d < 4; d++) {
                    int ny = tmp.y + dy[d];
                    int nx = tmp.x + dx[d];
 
                    if (ny < 0 || nx < 0 || ny >= N + 2 || nx >= M + 2)
                        continue;
                    if(visit[ny][nx])
                        continue;
                    if (map[ny][nx] == '*')
                        continue;
                    if (map[ny][nx] >= 'A' && map[ny][nx] <= 'Z') {
                        if (check[map[ny][nx] - 'A']) {
                            visit[ny][nx]=true;
                            q.add(new Sang(ny, nx));
                        }
                    } else if (map[ny][nx] >= 'a' && map[ny][nx] <= 'z'&&!check[map[ny][nx] - 'a']) {
 
                        check[map[ny][nx] - 'a'= true;
                        q = new LinkedList<>();
                        visit = new boolean[N+2][M+2];
                        visit[ny][nx] = true;
                        q.add(new Sang(ny, nx));
                    } else {
                        visit[ny][nx]=true;
                        q.add(new Sang(ny, nx));
                    }
 
                }
            }
 
            System.out.println(Answer);
 
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 12865  (0) 2020.03.01
백준 : 5214  (0) 2020.03.01
백준 : 1938  (0) 2020.02.29
백준 : 2234  (0) 2020.02.29
백준 : 1194  (0) 2020.02.29