알고리즘/BFS_DFS
[백준-7569]-[BFS]-토마토
팡스
2018. 11. 20. 13:06
문제링크 : https://www.acmicpc.net/problem/7569
이 문제는 7576 문제의 확장형이다.
문제를 접근 하는 방법은 단 1의 차이점도 없고 다만 2차원 배열에서 3차원 배열로 변한거 뿐이다.
7576번에서는 (row -1, col), (row + 1, col) , (row, col - 1), (row, col + 1) 4개 위치에 있는 토마토만 익히면 됐지만
이번 문제에서는 참조할 좌표가 두개가 더 추가된것 뿐이다.
참조할 좌표
height + 1, row, col
height - 1, row, col
height, row - 1, col
height, row + 1, col
height, row, col -1
height, row, col +1
문제를 접근하는 방법은 7576번 문제 글을 참조하면 된다.
2018/11/20 - [알고리즘/BFS_DFS] - [백준-7576]-[BFS]-토마토
소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static int row; // 행 크기 public static int col; // 열 크기 public static int height; // 쌓인박스 크기 public static int count; // 안익은 토마토 수 public static int max_date = Integer.MIN_VALUE; public static int[][][] tBox; public static Queue<int[]> queue; // 익은 토마토들을 담아 놓는다. public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); col = Integer.parseInt(st.nextToken()); row = Integer.parseInt(st.nextToken()); height = Integer.parseInt(st.nextToken()); tBox = new int[height][row][col]; queue = new LinkedList<int[]>(); for(int h = 0; h < height; h++) { for(int i = 0; i < row; i++) { st = new StringTokenizer(br.readLine()); for(int j = 0; j < col; j++) { tBox[h][i][j] = Integer.parseInt(st.nextToken()); if(tBox[h][i][j] == 1) queue.offer(new int[] {h, i, j, 0}); else if(tBox[h][i][j] == 0) count += 1; } } } BFS(); System.out.println(count > 0 ? -1 : max_date); } public static void setTomato(int h, int i, int j, int t) { tBox[h][i][j] = 1; queue.offer(new int[] {h, i, j, t}); count -= 1; } public static void BFS() { boolean[][][] visited = new boolean[height][row][col]; while(!queue.isEmpty()) { int h = queue.peek()[0]; int i = queue.peek()[1]; int j = queue.peek()[2]; int t = queue.peek()[3]; queue.poll(); if(h < 0 || i < 0 || j < 0) continue; if(h >= height || i >= row ||j >= col) continue; if(tBox[h][i][j] != 1) continue; if(visited[h][i][j]) continue; visited[h][i][j] = true; if(max_date < t) max_date = t; // 현재 위 아래 안익은 토마토 있는지 if(h > 0 && tBox[h-1][i][j] == 0) setTomato(h - 1, i, j, t + 1); if(h < height-1 && tBox[h+1][i][j] == 0) setTomato(h + 1, i, j, t + 1); // 현재 박스 주면 안익은 토마토 있는지 if(i > 0 && tBox[h][i-1][j] == 0) setTomato(h, i - 1, j, t + 1); if(i < row - 1 && tBox[h][i+1][j] == 0) setTomato(h, i+1, j, t+1); if(j > 0 && tBox[h][i][j-1] == 0) setTomato(h, i, j-1, t+1); if(j < col - 1 && tBox[h][i][j+1] == 0) setTomato(h, i, j+1, t+1); } } } | cs |