https://www.acmicpc.net/problem/7569
1. 익은 토마토 위치 구하고 큐에 넣기
2. 큐에 들은 아이템을 기반으로 BFS 탐색을 통해서, 더 이상 익은 토마토가 추가되지 않으면 종료.
* 큐에 들은 아이템을 이용, 토마토 배열을 탐색하면 시간초과 발생.
해설코드(C++).
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
|
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
static int[][][] arr;
static int[][] op = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
static int N, M, H;
static Scanner sc;
static int answer = 0, total = 0, cur = 0;
static Queue<item> q;
public static void main (String[] args) throws java.lang.Exception
{
sc = new Scanner(System.in);
q = new LinkedList<>();
M = sc.nextInt();
N = sc.nextInt();
H = sc.nextInt();
arr = new int[H + 1][N + 1][M + 1];
for(int i = 1; i <= H; i++){
for(int j = 1 ; j <= N; j++){
for(int k = 1; k <= M; k++){
arr[i][j][k] = sc.nextInt();
if(arr[i][j][k] == 0)
total += 1;
else if(arr[i][j][k] == 1)
q.add(new item(i, j, k, 0));
}
}
}
while(!q.isEmpty()){
item qItem = q.poll();
int h = qItem.h;
int r = qItem.r;
int c = qItem.c;
int d = qItem.day;
answer = d;
for(int i = 0; i < 6; i++){
int n_h = h + op[i][0];
int n_r = r + op[i][1];
int n_c = c + op[i][2];
if(n_h < 1 || n_h > H || n_r < 1 || n_r > N || n_c < 1 || n_c > M)
continue;
if(arr[n_h][n_r][n_c] == 0){
arr[n_h][n_r][n_c] = 1;
cur += 1;
q.add(new item(n_h, n_r, n_c, d + 1));
}
}
}
if(cur == total)
System.out.println(answer);
else
System.out.println(-1);
}
}
class item{
int r, c, h, day;
public item(int h, int r, int c, int d) {
this.h = h;
this.r = r;
this.c = c;
this.day = d;
}
}
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 3671] 산업 스파이의 편지(Java, 소수 구하기, DFS) (0) | 2020.08.08 |
---|---|
[BOJ 2981] 검문(Java, 유클리드 호제법, Set) (0) | 2020.08.08 |
[BOJ 11652] 카드(자바 적응기, 자료구조, Hashmap sort by key and value) (0) | 2020.08.06 |
[BOJ 1449] 수리공 항승(C++) (0) | 2020.07.20 |
[BOJ 2437] 저울(C++, 자세한 설명) (0) | 2020.07.11 |