백준 7569번: 토마토 :: 매운코딩
728x90
300x250

저번에 풀었던 토마토 문제의 업그레이드 버전.

위아래로 층이 생겨서 3차원배열을 이용해서 모든 토마토가 익는 최단시간 구하기 이다.

import java.util.*;

class Tomato {
	int row;
	int col;
	int height;
	int cnt;
	
	public Tomato(int h,int r,int c,int cnt) {
		this.height=h;
		this.row=r;
		this.col=c;
		this.cnt =cnt;
	}
}
public class Main {

	public static int N,M,H,ans = 0;
	public static int[][][] map;
	public static boolean[][][] visit;
	public static Queue<Tomato> q;
	public static int[] dx = {0,1,0,-1}; //동남서북
	public static int[] dy = {1,0,-1,0};
	public static int[] dh = {0,0,0,0,1,-1};
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		M = sc.nextInt();
		N = sc.nextInt();
		H = sc.nextInt();
		map = new int[H][N][M];
		visit = new boolean[H][N][M];
		q = new LinkedList<>();
		
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < N; j++) {
				for (int k = 0; k < M; k++) {
					map[i][j][k]= sc.nextInt();
					if(map[i][j][k]==1)
						q.add(new Tomato(i,j,k,0)); // 토마토가 있으면 큐에 넣어줌
				}
			}
		}
		
		bfs();
		System.out.println(ans);
		
	}
	public static void bfs() {
		
		Tomato t = null;
		
		while(!q.isEmpty()) { //큐가 빌 때까지
		
			int nh,nx,ny;
			t = q.poll();
			visit[t.height][t.row][t.col]=true;
			
			//방향 탐색
			//상하좌우
			for (int i = 0; i < dx.length + 2; i++) { //상하좌우 방향 4가지 + 층이동 방향 2가지
				
				//위아래 (층 이동)
				if(i>=4) {		
					nh = t.height + dh[i];
					nx = t.row;
					ny = t.col;
					
				} else {		
					
					nh = t.height;
					nx = t.row + dx[i];
					ny = t.col + dy[i];		
					
				}
	
				//범위 벗어나냐?
				if(nx >= N || ny >= M || nh >= H || nx < 0 || ny < 0 || nh < 0)
					continue;
				//토마토냐? 아니면 빈 박스냐?
				if(map[nh][nx][ny]!=0)
					continue;
				
				visit[nh][nx][ny] = true;
				map[nh][nx][ny] = 1; //익은 토마토가 되었습니다.
				q.add(new Tomato(nh,nx,ny,t.cnt+1));
			}
			
		}
		
		//종료조건
		//안익은 토마토가 있냐?
		if(isAllClear()) {
			ans = t.cnt;
			return;
		} else {
			ans = -1;
		}
	}
	
	public static boolean isAllClear() {
		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)
						return false;
				}
			}
		}
		return true;
	}

}
728x90

'알고리즘 > DFS & BFS' 카테고리의 다른 글

백준 10026번: 적록색약  (0) 2020.03.02
백준 2468번: 안전 영역  (0) 2020.03.02
백준 2178번: 미로 탐색  (0) 2020.03.01
백준 2583번: 영역 구하기  (0) 2020.03.01
백준 1012번: 유기농 배추  (0) 2020.03.01

+ Recent posts