백준 14502 연구소
업데이트:
백준 연구소
DFS를 통해 모든 빈곳의 벽을 만들고 BFS를 통해 좀비를 감염시켜 정상인이 많은 경우를 확인하여 구현했다.
막상 구현할때는 크게 어렵지 않았는데 처음에 어떻게 구현해야 할지 떠오르지가 않아 구글 검색으로 DFS+BFS 조합을 알아냈다.
처음엔 BFS 탐색시 메소드 4개를 빈곳이면 채워나가려고 했는데 처음 위치는 좀비였는데 빈곳일때만 재귀 호출을 가능하게 만들어 실패…
배열을 통해 미리 위치를 지정하고 좀 for문을 통해 구현해서 통과했다
- 소스 코드
import java.util.Scanner;
public class Laboratory {
static int limit = 3;
static int n, m;
static int[][] map;
static int result = 0;
static int[][] cloneMap;
static int[] nx = { 1, -1, 0, 0 };
static int[] ny = { 0, 0, 1, -1 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
map = new int[n][m];
cloneMap = new int[n][m];
//맵 셋팅
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = sc.nextInt();
}
}
per(0);
System.out.println(result);
}
private static void per(int cnt) {
if (cnt == limit) {
checkMap();
return;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == 0) {
map[i][j] = 1;
per(cnt + 1);
map[i][j] = 0;
}
}
}
}
private static void checkMap() {
// 맵 복사
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cloneMap[i][j] = map[i][j];
}
}
// 좀비 감염
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (cloneMap[i][j] == 2) {
setPoison(i, j);
}
}
}
int normal = 0;
// 생존자 확인
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (cloneMap[i][j] == 0) {
normal++;
}
}
}
result = Math.max(result, normal);
}
private static void setPoison(int i, int j) {
for (int k = 0; k < 4; k++) {
int x = i + nx[k];
int y = j + ny[k];
if (x >= 0 && y >= 00 && x < n && y < m) {
if (cloneMap[x][y] == 0) {
cloneMap[x][y] = 2;
setPoison(x, y);
}
}
}
}
}
댓글남기기