[백준] 7569번 토마토 (java, 3차원 bfs)

728x90
반응형

www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

앞뒤를 나타내는 좌표 이동을 추가해서 추가로 검사해준다.

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Pos{
	int h,y,x;

	public Pos(int h, int y, int x) {
		super();
		this.h = h;
		this.y = y;
		this.x = x;
	}
	
	
}

public class Main {
	static int m,n,h;
	static int[][][] map;
	static Queue<Pos> q=new LinkedList<Pos>();
	static int[] xpos= {1,-1,0,0,0,0};
	static int[] ypos= {0,0,1,-1,0,0};
	static int[] zpos= {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];
		
		for (int k = 0; k < h; k++) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					map[k][i][j]=sc.nextInt();
					if(map[k][i][j]==1) {
						q.add(new Pos(k,i,j));
					}
				}
			}
		}
		
		
		int time=0;
		while(q.size()!=0) {
			
			int len=q.size();
			for (int i = 0; i < len; i++) {
				Pos cur=q.poll();
				int z=cur.h;
				int y=cur.y;
				int x=cur.x;
				
				for (int k = 0; k < 6; k++) {
					int xx=x+xpos[k];
					int yy=y+ypos[k];
					int zz=z+zpos[k];
					if(xx<0 || yy<0 || zz<0 || xx>=m || yy>=n || zz>=h)continue;
					if(map[zz][yy][xx]==0) {
						map[zz][yy][xx]=1;
						q.add(new Pos(zz,yy,xx));
					}
				}
			}
			if(q.size()!=0) {
				time++;
			}
			
		}
		
		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);
						System.exit(0);
					}
				}
			}
		}
		
		System.out.println(time);
		
	}
}
728x90
반응형
TAGS.

Comments