1) 문제
https://www.acmicpc.net/problem/7569
2) 접근 방법
아 지난번에 조금 더 쉬운 버전의 토마토 문제(https://www.acmicpc.net/problem/7576)를 풀었었는데 비슷하게 풀면 될 것 같은데... 일수를 계산하는 부분에서 막혀서.. 지난번에 썼던 글을 조금 참고해서 마저 풀었다.
지난번에 쓴 글 : https://velog.io/@godqhrals/JAVA-%EB%B0%B1%EC%A4%80-7576-%ED%86%A0%EB%A7%88%ED%86%A0
3중 for문에서 익은 토마토들을 발견할 때마다 큐에 넣고,
큐에서 하나씩 꺼내보면서
depth를 현재 depth + 1 로 진행해주면 된다!!
이걸 깜빡해서 결국 과거의 나에게 힌트를 얻었는데.. 덕분에 풀었다!!
하 기록의 중요성을 또 깨닫고 갑니다..
그리고 질문 게시판에 있는 웬만한 반례는 다 맞게 나왔는데
바로 틀렸습니다가 떠서...
https://www.acmicpc.net/board/view/115199
이 반례를 제시해주신 분.. 정말 감사합니다!!
덕분에 해결하고 맞았습니다!! 를 만났습니다...
3) 코드
import java.io.*;
import java.util.*;
public class Main {
static int m, n, h;
static int[][][] map;
static int[][][] visited;
static int[] dx = {-1, 1, 0, 0, 0, 0};
static int[] dy = {0, 0, -1, 1, 0, 0};
static int[] dz = {0, 0, 0, 0, -1, 1};
static Queue<Node> q = new LinkedList<>();
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());
h = Integer.parseInt(st.nextToken());
map = new int[h][n][m];
visited = new int[h][n][m];
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
st = new StringTokenizer(br.readLine());
for (int k = 0; k < m; k++) {
map[i][j][k] = Integer.parseInt(st.nextToken());
}
}
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
if (map[i][j][k] == 1 && visited[i][j][k] == 0) {
q.offer(new Node(i, j, k));
visited[i][j][k] = 1; // +1으로 설정
}
}
}
}
bfs();
int result = -1;
for (int i = 0; i < h; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < m; k++) {
if (map[i][j][k] == 0 && visited[i][j][k] == 0) {
System.out.println(-1);
return;
} else {
result = Math.max(result, visited[i][j][k]);
}
}
}
}
System.out.println(result - 1);
}
static void bfs() {
while (!q.isEmpty()) {
Node now = q.poll();
for (int i = 0; i < 6; i++) {
int nx = now.x + dx[i];
int ny = now.y + dy[i];
int nz = now.z + dz[i];
if (nx < 0 || ny < 0 || nz < 0 || nx >= n || ny >= m || nz >= h) continue;
if (map[nz][nx][ny] == 0 && visited[nz][nx][ny] == 0) {
q.offer(new Node(nz, nx, ny));
visited[nz][nx][ny] = visited[now.z][now.x][now.y] + 1;
}
}
}
}
}
class Node {
int x;
int y;
int z;
Node (int z, int x, int y) {
this.x = x;
this.y = y;
this.z = z;
}
}