한번에 동시에 진행하기 때문에 bfs를 써야 한다고 생각했다.
처음 배열을 입력하며 1인 위치를 시작점으로 add 해준 후 queue를 돌린다.
day를 따로 선언한 후에 같은 level이 진행할 때는 독립적으로 증가하도록 한다.
모두 방문을 한 후에 queue가 종료되면 안익은 사과가 있는지 탐색한다.
visited가 false인 사과가 하나라도 있다면 -1을 반환한다.
없다면 day 반환
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static Queue<int[]> queue = new ArrayDeque<>();
static boolean[][] visited; // 방문관리 배열
static int array[][];
static int answer=0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
array = new int[M][N];
visited = new boolean[M][N];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
array[i][j]=Integer.parseInt(st.nextToken());
if (array[i][j]==1) {
queue.add(new int[] {i,j,0});
visited[i][j]=true;
}
else if(array[i][j]==-1)
visited[i][j]=true;
}
}
System.out.println(bfs());
}
public static int bfs() {
int[] cur = new int[3];
int di[]= {-1,0,1,0};
int dj[]= {0,1,0,-1};
int dx=0,dy=0,day=0;
while(!queue.isEmpty()) {
cur=queue.poll();
for (int i = 0; i < 4; i++) {
dx = cur[0]+di[i];
dy = cur[1]+dj[i];
day = cur[2];
if(dx>=0&&dy>=0&&dx<array.length&&dy<array[0].length) {
if(!visited[dx][dy]&&array[dx][dy]==0) {
visited[dx][dy]=true;
queue.add(new int[] {dx,dy,++day});
}
}
}
}
int k;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
if(!visited[i][j])
return -1;
}
}
return day;
}
}