import java.io.*;
import java.util.*;
class Dot{
int x, y, z;
Dot(int z, int x, int y){
this.x=x;
this.y=y;
this.z=z;
}
}
class Main{
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuilder sb=new StringBuilder();
static int N, M, H, cnt=0;
static int[][][] map;
// static boolean[][][] isVisit;
static int[] dx= {0, 1, 0, -1, 0, 0};
static int[] dy= {1, 0, -1, 0, 0, 0};
static int[] dz= {0, 0, 0, 0, 1, -1};
public static void main(String args[]) throws Exception {
String s[]=br.readLine().split(" ");
M=Integer.parseInt(s[0]);
N=Integer.parseInt(s[1]);
H=Integer.parseInt(s[2]);
map=new int[H][N][M];
// isVisit=new boolean[H][N][M];
for(int k=0;k<H;k++) {
for(int i=0;i<N;i++) {
String s1[]=br.readLine().split(" ");
for(int j=0;j<M;j++) {
map[k][i][j]=Integer.parseInt(s1[j]);
}
}
}
// print();
bfs();
}
public static void print() {
for(int k=0;k<H;k++) {
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++) {
System.out.print(map[k][i][j]+" ");
}
System.out.println();
}
System.out.println("-----------------");
}
}
public static void bfs() {
Queue<Dot> q=new LinkedList<>();
// 토마토가 익었으면 큐에 삽입
for(int k=0;k<H;k++) {
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++) {
if(map[k][i][j]==1) q.add(new Dot(k, i, j));
}
}
}
while(!q.isEmpty()) {
Dot dot=q.poll();
for(int i=0;i<6;i++) {
int nextX=dot.x+dx[i];
int nextY=dot.y+dy[i];
int nextZ=dot.z+dz[i];
// 범위를 벗어난 경우 패스
if(nextX<0||nextY<0||nextX>=N||nextY>=M||nextZ<0||nextZ>=H) continue;
// 익지 않은 토마토가 아니면 패스,
if(map[nextZ][nextX][nextY]!=0) continue;
// 현재 위치=전 위치 +1(일수를 계산)
map[nextZ][nextX][nextY]=map[dot.z][dot.x][dot.y]+1;
q.add(new Dot(nextZ, nextX, nextY));
}
}
int max=0;
for(int k=0;k<H;k++) {
for(int i=0;i<N;i++) {
for(int j=0;j<M;j++) {
if(map[k][i][j]==0) {
System.out.println(-1);
return;
}
max=Math.max(max, map[k][i][j]);
}
}
}
System.out.println(max-1);
}
}
지난 번에 풀어보았던 7576번 토마토 문제와 비슷했습니다.
한 가지 차이점은 3차원 배열을 이용했다는 점이었는데요, 이를 이용해서 이전의 코드를 3차원 배열로 바꿔서 다루어서 쉽게 풀 수 있었습니다.
eloquence-developers.tistory.com/113
'프로그래밍 문제 > BOJ(백준 온라인 저지)' 카테고리의 다른 글
[BOJ 15595번] 정답 비율 계산(JAVA) (0) | 2020.09.29 |
---|---|
[BOJ 2206번] 벽 부수고 이동하기(JAVA) (0) | 2020.09.25 |
[BOJ 7576번] 토마토(JAVA) (0) | 2020.09.23 |
백준 3052 / C / 나머지 / * (0) | 2020.09.23 |
[BOJ 2178번] 미로탐색(JAVA) (0) | 2020.09.22 |