https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
Java 코드
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class Main {
static int m, n, h;
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 int[][][] arr;
static Queue<int[]> q = new LinkedList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
n = sc.nextInt();
h = sc.nextInt();
arr = new int[h][n][m];
for(int i = 0; i < h; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < m; k++) {
arr[i][j][k] = sc.nextInt();
if(arr[i][j][k] == 1) q.add(new int[] {i, j, k});
}
}
}
int result = bfs();
System.out.println(result);
}
public static int bfs() {
while(!q.isEmpty()) {
int[] num = q.poll();
int c = num[0];
int a = num[1];
int b = num[2];
for(int i = 0; i < 6; i++) {
int x = a + dx[i];
int y = b + dy[i];
int z = c + dz[i];
if(x >= 0 && y >= 0 && z >= 0 && x < n && y < m && z < h && arr[z][x][y] == 0) {
arr[z][x][y] = arr[c][a][b] + 1;
q.add(new int[] {z, x, y});
}
}
}
int max = -1;
for(int i = 0; i < h; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < m; k++) {
if(arr[i][j][k] == 0) return -1;
max = Math.max(max, arr[i][j][k]);
}
}
}
return max - 1;
}
}
'백준' 카테고리의 다른 글
백준 1759 암호 만들기(Java) (0) | 2023.02.26 |
---|---|
백준 9251 LCS(Java) (0) | 2023.02.26 |
백준 10026 적록색약(Java) (0) | 2023.02.25 |
백준 15312 이름 궁합(Java) (0) | 2023.02.25 |
백준 1011 Fly me to the Alpha Centauri(Java) (0) | 2023.02.24 |