본문 바로가기

ProgramSoliving

백준 : 2234

반응형

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

 

2234번: 성곽

문제 대략 위의 그림과 같이 생긴 성곽이 있다. 굵은 선은 벽을 나타내고, 점선은 벽이 없어서 지나다닐 수 있는 통로를 나타낸다. 이러한 형태의 성의 지도를 입력받아서 다음을 계산하는 프로그램을 작성하시오. 이 성에 있는 방의 개수 가장 넓은 방의 넓이 하나의 벽을 제거하여 얻을 수 있는 가장 넓은 방의 크기 위의 예에서는 방은 5개고, 가장 큰 방은 9개의 칸으로 이루어져 있으며, 위의 그림에서 화살표가 가리키는 벽을 제거하면 16인 크기의 방을 얻을

www.acmicpc.net

 

서 : 1 , 북 : 10  , 동 : 100 , 남 : 1000 비트마스크 문제.
구역을 구하기위해 이중 포문으로 방문하면서 방의 개수를 구한다.

각각의 marking에 맞는 방의 개수를 구하느 cnt 배열을 만들어서 방의 크기를 저장한다.
-> 이값으로 가장 큰 방의 크기를 구해낸다.

방하나를 파괴한다는것은 서로다른 marking의 번호 방을 합친다는 뜻이다. for for 돌면서 오른쪽 밑 에 서로다른 marking의 방번호가 잇는 구역에 대해서 두개의 방 영역을 합한다. 
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
 
public class B2234 {
    static int map[][];
    static int visit[][];
    static int N, M;
    static int dy[] = { 0-101 };
    static int dx[] = { -1010 };
 
    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());
 
        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
 
        map = new int[N][M];
        visit = new int[N][M];
        int cnt[] = new int[N * M + 1];
        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());
            }
        }
 
        int marking = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (visit[i][j] != 0)
                    continue;
                marking++;
                Queue<Pair> q = new LinkedList<>();
 
                visit[i][j] = marking;
                cnt[marking]++;
                q.add(new Pair(i, j));
 
                while (!q.isEmpty()) {
                    Pair tmp = q.poll();
                    for (int d = 0; d < 4; d++) {
                        if ((map[tmp.y][tmp.x] & (1 << d)) == (1 << d))
                            continue;
                        int ny = tmp.y + dy[d];
                        int nx = tmp.x + dx[d];
                        if (visit[ny][nx] != 0)
                            continue;
 
                        visit[ny][nx] = marking;
                        cnt[marking]++;
                        q.add(new Pair(ny, nx));
 
                    }
 
                }
            }
        }
        int maxValue = 0;
        for(int i=1;i<=marking;i++) {
            maxValue = Math.max(maxValue, cnt[i]);
        }
        
        int maxSum = 0;
        for(int i=0;i<N;i++) {
            for(int j=0;j<M;j++) {
                //옆
                int ny = i;
                int nx = j+1;
                if(nx<&& visit[i][j]!=visit[ny][nx]) {
                    maxSum = Math.max(maxSum, cnt[visit[i][j]] + cnt[visit[ny][nx]]);
                }
                
                //밑
                ny = i +1;
                nx = j;
                if(ny<&& visit[i][j]!=visit[ny][nx]) {
                    maxSum = Math.max(maxSum, cnt[visit[i][j]] + cnt[visit[ny][nx]]);
                }
            }
        }
        
        System.out.println(marking);
        System.out.println(maxValue);
        System.out.println(maxSum);
        
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 9328  (0) 2020.02.29
백준 : 1938  (0) 2020.02.29
백준 : 1194  (0) 2020.02.29
백준 : 1939  (0) 2020.02.29
백준 : 1726  (0) 2020.02.29