728x90
package a0225;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class 백준7576토마토 {
static int garo ;
static int sero ;
static int[][] arr ;
static int[][] visit ;
static int maxday;
static int search() { // 0이 하나라도 있으면 1반환, 0이 없으면 0 반환
int flag = 0;
for(int i=0; i<sero; i++) {
for(int j=0; j<garo; j++) {
if(arr[i][j] == 0) {
flag = 1;
return flag;
}
}
}
return flag;
}
static int[] di = { -1, 0, 1, 0};
static int[] dj = {0, 1, 0, -1}; //방향 6개 (위,아래,상우하좌)
static boolean check(int i, int j) {
if(0<=i&&i<sero && 0<=j&&j<garo)return true;
return false;
}
static void bfs() {
Queue<int[]> q = new LinkedList<int[]>(); //좌표 큐 선언
//초기설정
for(int i=0; i<sero; i++) {
for(int j=0; j<garo; j++) {
if(arr[i][j] == 1) {
q.add(new int[] {i,j,0}); //좌표 + day
}
}
}
while(!q.isEmpty()) {
int[] now = q.poll();
int nowi = now[0]; int nowj = now[1]; int day = now[2];
maxday = Math.max(maxday, day);
for(int d=0; d<4; d++) {
int ni = nowi+di[d];
int nj = nowj+dj[d];
if(check(ni,nj) && arr[ni][nj]==0 && visit[ni][nj]==0) {
visit[ni][nj] = 1;
arr[ni][nj] = 1; //arr[ni][nj]
q.add(new int[] {ni, nj, day+1});
}
}
}
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer ST = new StringTokenizer(br.readLine());
garo = Integer.parseInt(ST.nextToken());
sero = Integer.parseInt(ST.nextToken());
arr = new int[sero][garo];
visit = new int[sero][garo];
for(int i=0; i<sero; i++) {
ST = new StringTokenizer(br.readLine());
for(int j=0; j<garo; j++) {
arr[i][j] = Integer.parseInt(ST.nextToken());
}
}
if(search()==0)System.out.println(0); //처음부터 모두 익어있는 경우
else {
bfs();
if(search()==1)System.out.println(-1); //bfs 다 돌렸는데도 안익은곳 있는경우
else {
System.out.println(maxday);
}
}
}
}
'알고리즘 문제풀이' 카테고리의 다른 글
백준2563-색종이 java (0) | 2022.02.26 |
---|---|
백준2559-수열 java (0) | 2022.02.26 |
백준2491-수열 java (0) | 2022.02.26 |
백준2477-참외밭 java (0) | 2022.02.26 |
백준2309-일곱난쟁이 java (0) | 2022.02.26 |