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;
}
}
}