Java

[백준] 7576번 토마토 - 자바, Java

힛해 2023. 10. 13. 15:56
728x90

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

package B7576;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Point {
	int x;
	int y;
	int depth;

	public Point(int x, int y, int depth) {
		this.x = x;
		this.y = y;
		this.depth = depth;
	}

}

public class Main {

	static int[][] dt = { { 1, -1, 0, 0 }, { 0, 0, 1, -1 } };
	static int c;
	static int r;
	static boolean[][] flag;
	static int[][] map;
	Point pp;
	static int result = 0;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		c = Integer.parseInt(st.nextToken());
		r = Integer.parseInt(st.nextToken());

		ArrayList<Point> arr = new ArrayList<>();
		map = new int[r][c];
		flag = new boolean[r][c];
		for (int i = 0; i < r; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < c; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if (map[i][j] == 1) {
					arr.add(new Point(i, j,0));
					flag[i][j] = true;
				} else if (map[i][j] == -1) {
					flag[i][j] = true;
				}
			}
		} // for
		
		func(arr);

		for (int i = 0; i < r; i++) {

			for (int j = 0; j < c; j++) {
				if(flag[i][j]==false) {
					result = -1;
				}
			}
		}
		

		System.out.println(result);

	}// main

	public static void func(ArrayList<Point> q) {
		Queue<Point> points = new LinkedList<Point>();
		
		for(int i = 0; i<q.size(); i++) {
			points.offer(q.get(i));			
		}
		
		while (!points.isEmpty()) {
			Point p = points.poll();
			
			
			for (int i = 0; i < 4; i++) {
				int x = p.x + dt[0][i];
				int y = p.y + dt[1][i];
				if (x < 0 || x >= r || y < 0 || y >= c || flag[x][y] == true) {
					continue;
				}
				flag[x][y] = true;
				points.offer(new Point(x, y,p.depth+1));
			}
			result = p.depth;

		}

	}
}