본문 바로가기

ProgramSoliving

백준 : 16946

반응형

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

 

16946번: 벽 부수고 이동하기 4

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이 변을 공유할 때, 인접하다고 한다. 각각의 벽에 대해서 다음을 구해보려고 한다. 벽을 부수고 이동할 수 있는 곳으로 변경한다. 그 위치에서 이동할 수 있는 칸의 개수를 세어본다.

www.acmicpc.net

하나의 정점에서 BFS를 탐색을 한다면 시간초과걸린다 일단 모든 정점을 0으로 이어저있는칸의 구간별로 개수를 센다. 이렇게 모든 값을 매긴다음 1을 기준으로 구역이 인접해있는지센다. 잇때 set을 쓰는데 같은 구역에서는 중복해서 더하면  안되기 때문이다. 이런 최적화 문제도 자주 푸는것이 좋을거 같다.
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
package day0311;
 
 
public class B16946 {
    static int N, M;
    static char[][] map;
    static int[][] Answer;
    static int[][] cntMap;
    static int dy[] = { 1-100 };
    static int dx[] = { 001-1 };
    static ArrayList<Integer> cnt = new ArrayList<Integer>();
    static int num;
 
    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 IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        cnt.add(0);
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
 
        map = new char[N][M];
        Answer = new int[N][M];
        cntMap = new int[N][M];
        num = 1;
 
        for (int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
 
                if (map[i][j] == '0' && cntMap[i][j]==0) {
                    cntMap[i][j] = num;
 
                    Queue<Pair> q = new LinkedList<>();
                    q.add(new Pair(i, j));
                    int thisCnt =0;
                    while (!q.isEmpty()) {
                        Pair cur = q.poll();
                        thisCnt++;
 
                        for (int d = 0; d < 4; d++) {
                            int ny = cur.y + dy[d];
                            int nx = cur.x + dx[d];
                            if (ny < 0 || nx < 0 || ny >= N || nx >= M)
                                continue;
                            if (map[ny][nx] == '1')
                                continue;
                            if (cntMap[ny][nx] != 0)
                                continue;
                            cntMap[ny][nx] = num;
                            q.add(new Pair(ny, nx));
                        }
                    }
                    cnt.add(thisCnt);
                    num++;
                }
            }
        }
        
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if(map[i][j]=='1') {
                    TreeSet<Integer> set = new TreeSet<Integer>();
                    for(int d=0;d<4;d++) {
                        int ny = i+dy[d];
                        int nx = j+dx[d];
                        if(ny<0||nx<0||ny>=N||nx>=M)continue;
                        if(cntMap[ny][nx]==0)continue;
                        set.add(cntMap[ny][nx]);
                    }
                    Iterator<Integer> it = set.iterator();
                    while(it.hasNext()) {
                        Answer[i][j]+=cnt.get(it.next());
                    }
                    sb.append((Answer[i][j]+1)%10);
                }else {
                    sb.append(0);
                }
            }
            sb.append("\n");
        }
 
        System.out.print(sb.toString());
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 12886  (0) 2020.03.15
백준 : 1086 JAVA  (0) 2020.03.14
백준 : 10217  (0) 2020.03.08
벨만포드 알고리즘 : 백준 11657 ( 타임머신)  (0) 2020.03.08
백준 : 1039 JAVA  (0) 2020.03.07