Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

최's 먹공로그

BOJ14502_연구소 본문

APS

BOJ14502_연구소

ChoiSH313 2019. 3. 14. 08:46

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

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
// class 사용계속 해보기!!
class Wall {
    int r;
    int c;
 
    public Wall(int r, int c) {
        super();
        this.r = r;
        this.c = c;
    }
}
 
public class Main {
 
    private static int N;
    private static int M;
    private static ArrayList<Wall> list; // Wall객체형태의 ArrayList
    private static int[][] map;
    private static Queue<Integer> q;
    private static int cnt_zero;
    private static int max;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        list = new ArrayList<>();
 
        map = new int[N][M];
        map_clone = new int[N][M];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < M; j++) {
                int number = Integer.parseInt(st.nextToken());
                map[i][j] = number;
                if (map[i][j] == 0) { // 조합을 돌리기 위해 list에 0인 위치를 넣음
                    list.add(new Wall(i, j));
                }
            }
        }
        // 벽 3개 둘곳 정하기 , 0인 위치가 10개라면 10C3
        comb(003); // 0조합을 담을 리스트에 넣을 인덱스, list에서 빼올 인덱스, 3이 뽑을 갯수
        System.out.println(max);
 
    } // end of main
 
    static ArrayList<Wall> aList = new ArrayList<>(); // 뽑은 조합을 담을 리스트
    static int[][] map_clone;
    
    private static void comb(int cnt, int t, int limit) {
        
        if (cnt == limit) { // 한개의 조합이 나오는 경우
            // map복제본에 계속 복사해서 map_clone을 사용
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    map_clone[i][j] = map[i][j];
                }
            }
            // map_clone에서 0인부분에 벽을 세우기
            for (int i = 0; i < aList.size(); i++) {
                int r = aList.get(i).r;
                int c = aList.get(i).c;
                // 벽세우고
                map_clone[r][c] = 1;
            }
            
            // 바이러스 퍼트리기
            q = new LinkedList<>();
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    if (map_clone[j][k] == 2) {
                        q.add(j);
                        q.add(k);
                    }
                }
            }
            bfs();
            
            // 0인부분 cnt_zero++
            cnt_zero = 0;
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if(map_clone[i][j] == 0) {
                        cnt_zero++;
                    }
                }
            }
            if(max < cnt_zero) {
                max = cnt_zero;
            }
            return;
        }
        for (int i = t; i < list.size(); i++) {
            aList.add(list.get(i));
            comb(cnt + 1, i + 1, limit);
            aList.remove(aList.size() - 1);
        }
    } // end of comb
 
    static int[] dx = { 010-1 };
    static int[] dy = { -1010 };
 
    private static void bfs() {
 
        while (!q.isEmpty()) {
            int qx = q.poll();
            int qy = q.poll();
            for (int i = 0; i < 4; i++) {
                int nx = qx + dx[i];
                int ny = qy + dy[i];
                if (nx >= 0 && nx < N && ny >= 0 && ny < M && map_clone[nx][ny] == 0) {
                    map_clone[nx][ny] = 2;
                    q.add(nx);
                    q.add(ny);
                }
            }
        }
 
    } // end of bfs
// end of class
 
cs

'APS' 카테고리의 다른 글

BOJ16235_나무 재테크  (4) 2019.04.11
JUNGOL1018_십자카드 문제  (1) 2019.03.23
BOJ7569_토마토  (0) 2019.03.12
BOJ7576_토마토  (0) 2019.03.12
SEA7236_저수지의 물의 총 깊이 구하기  (0) 2019.03.10