https://www.acmicpc.net/problem/14502
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
static int N, M, maxSafyArea = 0;
static int[][] map, spreadMap;
static ArrayList<Pos> virusList = new ArrayList<>();
static class Pos {
int r, c;
public Pos(int r, int c) {
this.r = r;
this.c = c;
}
}
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());
map = new int[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());
if (map[i][j] == 2) {
virusList.add(new Pos(i, j));
}
}
}
combination(0, 0);
System.out.println(maxSafyArea);
}
private static void combination(int cnt, int start) {
// 벽 세우기
if (cnt == 3) {
// 바이러스 뿌리고
spreadVirus();
// maxSafyArea 구하기
maxSafyArea = Math.max(maxSafyArea, getMaxSafyArea());
return;
}
for (int i = start; i < N * M; i++) {
int r = i / M; // 행
int c = i % M; // 열
if (map[r][c] == 0) {
map[r][c] = 1;
combination(cnt + 1, i + 1);
map[r][c] = 0;
}
}
}
private static void spreadVirus() {
arrayCopy();
Queue<Pos> q = new LinkedList<>();
for (Pos pos : virusList) {
q.offer(pos);
}
while (!q.isEmpty()) {
Pos p = q.poll();
for (int dir = 0; dir < 4; dir++) {
int nr = p.r + dr[dir];
int nc = p.c + dc[dir];
//경계 내에 있고 빈칸 이라면
if (nr >= 0 && nr < N && nc >= 0 && nc < M && spreadMap[nr][nc] == 0) {
spreadMap[nr][nc] = 2;
q.offer(new Pos(nr, nc));
}
}
}
}
private static void arrayCopy() {
spreadMap = new int[N][];
for (int i = 0; i < N; i++) {
spreadMap[i] = map[i].clone();
}
}
private static int getMaxSafyArea() {
int safeArea = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (spreadMap[i][j] == 0) {
safeArea++;
}
}
}
return safeArea;
}
}
'Baekjoon Online Judge > Java' 카테고리의 다른 글
[Baekjoon Online Judge] 1707 - 이분 그래프 / Java (0) | 2021.09.06 |
---|---|
[Baekjoon Online Judge] 1915 - 가장 큰 정사각형 / Java (0) | 2021.09.06 |
[Baekjoon Online Judge] 1987 - 알파벳 / Java (0) | 2021.08.19 |
[Baekjoon Online Judge] 3109 - 빵집 / Java (0) | 2021.08.19 |
[Baekjoon Online Judge] 1992 - 쿼드트리 / Java (0) | 2021.08.18 |