목차
문제
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String args[]) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int board [][][] = new int [n][m][h];
int dist [][][] = new int [n][m][h];
Queue<Point> que = new LinkedList<>();
for(int k=0;k<h;k++) {
for(int i=0;i<n;i++) {
st = new StringTokenizer(br.readLine());
for(int j=0;j<m;j++) {
board[i][j][k] = Integer.parseInt(st.nextToken());
if(board[i][j][k] == 1) {
que.add(new Point(i, j, k));
dist[i][j][k] = 0;
}
}
}
}
int dx [] = { 1, 0, -1, 0, 0, 0};
int dy [] = { 0, 1, 0, -1, 0, 0};
int dz [] = { 0, 0, 0, 0, 1, -1};
while(!que.isEmpty()) {
Point cur = que.poll();
for(int i=0;i<6;i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
int nz = cur.z + dz[i];
if(nx < 0 || ny < 0 || nz < 0 || nx >= n || ny >= m || nz >= h) continue;
if(board[nx][ny][nz] == -1 || board[nx][ny][nz] == 1) continue;
que.add(new Point(nx, ny, nz));
dist[nx][ny][nz] = dist[cur.x][cur.y][cur.z] + 1;
board[nx][ny][nz] = 1;
}
}
for(int k=0;k<h;k++) {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(board[i][j][k] == 0) {
System.out.print(-1);
return;
}
}
}
}
int ans = 0;
for(int k=0;k<h;k++) {
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(ans < dist[i][j][k]) {
ans = dist[i][j][k];
}
}
}
}
System.out.print(ans);
}
static class Point {
int x;
int y;
int z;
public Point(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
}
}
문제
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
코드
import java.io.*; import java.util.*; class Main { public static void main(String args[]) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int m = Integer.parseInt(st.nextToken()); int n = Integer.parseInt(st.nextToken()); int h = Integer.parseInt(st.nextToken()); int board [][][] = new int [n][m][h]; int dist [][][] = new int [n][m][h]; Queue<Point> que = new LinkedList<>(); for(int k=0;k<h;k++) { for(int i=0;i<n;i++) { st = new StringTokenizer(br.readLine()); for(int j=0;j<m;j++) { board[i][j][k] = Integer.parseInt(st.nextToken()); if(board[i][j][k] == 1) { que.add(new Point(i, j, k)); dist[i][j][k] = 0; } } } } int dx [] = { 1, 0, -1, 0, 0, 0}; int dy [] = { 0, 1, 0, -1, 0, 0}; int dz [] = { 0, 0, 0, 0, 1, -1}; while(!que.isEmpty()) { Point cur = que.poll(); for(int i=0;i<6;i++) { int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; int nz = cur.z + dz[i]; if(nx < 0 || ny < 0 || nz < 0 || nx >= n || ny >= m || nz >= h) continue; if(board[nx][ny][nz] == -1 || board[nx][ny][nz] == 1) continue; que.add(new Point(nx, ny, nz)); dist[nx][ny][nz] = dist[cur.x][cur.y][cur.z] + 1; board[nx][ny][nz] = 1; } } for(int k=0;k<h;k++) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(board[i][j][k] == 0) { System.out.print(-1); return; } } } } int ans = 0; for(int k=0;k<h;k++) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(ans < dist[i][j][k]) { ans = dist[i][j][k]; } } } } System.out.print(ans); } static class Point { int x; int y; int z; public Point(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } } }