토마토
백준 7576: 토마토
풀이
BFS를 이용
저장될때부터 모든 토마토가 익었는지 확인, BFS 계산 후 익지 않은 토마토가 있는지 확인을 위해 for문을 통해 2차원 배열을 확인하기
소스코드
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static class Node {
int r, c, day;
Node(int r, int c, int day) {
this.r = r;
this.c = c;
this.day = day;
}
@Override
public String toString() {
return "Node [r=" + r + ", c=" + c + ", day=" + day + "]";
}
}
static int dr[] = { -1, 1, 0, 0 };
static int dc[] = { 0, 0, -1, 1 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt(); // 상자 가로 칸의 수(열)
int N = sc.nextInt(); // 상자 세로 칸의 수(행)
int[][] box = new int[N][M];
Queue<Node> queue = new LinkedList<>();
int day = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
box[i][j] = sc.nextInt();
if (box[i][j] == 1)
queue.add(new Node(i, j, 0));
}
}
// 저장될때부터 모든 토마토가 익어있으면 0 출력
boolean flag = true;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (box[i][j] == 0)
flag = false;
}
}
if (!flag) { //안익은 토마토가 있다면
while (!queue.isEmpty()) {
Node node = queue.poll();
for (int d = 0; d < 4; d++) {
int nr = node.r + dr[d];
int nc = node.c + dc[d];
if (nr >= 0 && nc >= 0 && nr < N && nc < M) {
if (box[nr][nc] == 0) { // 익지 않은 토마토들이 있다면
box[nr][nc] = 1;
queue.add(new Node(nr, nc, node.day + 1));
}
}
}
day = node.day;
}
//토마토가 모두 익었는지 안익었는지 확인
boolean check = true;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(box[i][j]==0) //안익은 토마토가 존재
check=false;
}
}
if(check) {
System.out.println(day);
}else {
System.out.println(-1);
}
}
else { //처음부터 토마토가 다 익어있는 경우
System.out.println(0);
}
}
}