728x90
import java.io.*;
import java.util.*;
public class Main {
static int count = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int[][] map = new int[x][y];
boolean[][] visited = new boolean[x][y];
String[] one = new String[x * y];
int count = 0;
for(int ii = 0 ; ii < x ; ii++)
{
st = new StringTokenizer(br.readLine());
for(int jj = 0 ;jj < y ; jj++)
{
map[ii][jj] = Integer.parseInt(st.nextToken());
if(map[ii][jj] == 1)
one[count++] = ii + "," + jj;
}
}
Queue<String> q = new LinkedList<>();
for(int ii = 0 ; ii < count ; ii++)
q.add(one[ii]);
bfs(q, map, visited, x, y);
/* 이 주석을 풀면 bfs가 퍼져나가는 모습을 볼 수 있다.
for(int ii = 0 ; ii < x ; ii++)
{
for(int jj = 0 ;jj < y ; jj++)
System.out.print(map[ii][jj] + " ");
System.out.println();
}
*/
int max = 0;
for(int ii = 0 ; ii < x ; ii++)
{
for(int jj = 0 ;jj < y ; jj++)
{
if(max <map[ii][jj])
max = map[ii][jj];
else if(map[ii][jj] == 0)
{
max = 0;
break;
}
}
if(max == 0)
break;
}
System.out.println(max - 1);
br.close();
}
static public void bfs(Queue<String> q, int[][] map, boolean[][] visited, int X, int Y) {
while (!q.isEmpty()) {
int x = 0;
int y = 0;
String s = q.poll();
String[] a = s.split(",");
x = Integer.parseInt(a[0]);
y = Integer.parseInt(a[1]);
visited[x][y] = true;
if (up(map, visited, X, Y, x, y) == true) {
map[x - 1][y] = map[x][y] + 1;
String stemp = (x - 1) + "," + y;
q.add(stemp);
}
if (right(map, visited, X, Y, x, y) == true) {
map[x][y + 1] = map[x][y] + 1;
String stemp = x + "," + (y + 1);
q.add(stemp);
}
if (down(map, visited, X, Y, x, y) == true) {
map[x + 1][y] = map[x][y] + 1;
String stemp = (x + 1) + "," + y;
q.add(stemp);
}
if (left(map, visited, X, Y, x, y) == true) {
map[x][y - 1] = map[x][y] + 1;
String stemp = x + "," + (y - 1);
q.add(stemp);
}
}
}
public static boolean up(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(x-1 >= 0 && map[x -1][y] == 0 && visited[x-1][y] == false)
return true;
else
return false;
}
public static boolean right(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(y+1 < Y && map[x][y+1] == 0 && visited[x][y+1] == false)
return true;
else
return false;
}
public static boolean down(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(x+1 < X && map[x+1][y] == 0 && visited[x+1][y] == false)
return true;
else
return false;
}
public static boolean left(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
{
if(y-1 >= 0 && map[x][y-1] == 0 && visited[x][y-1] == false)
return true;
else
return false;
}
}
728x90
'코딩 테스트' 카테고리의 다른 글
6603번 로또 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.11 |
---|---|
1012번 유기농 배추 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.11 |
11728번 배열 합치기 문제(자바, java) - 백준 문제풀이 (0) | 2023.01.09 |
2217번 로프(자바, java) - 백준 문제풀이 (0) | 2023.01.09 |
12101번 1, 2, 3 더하기 2(자바, java) - 백준 문제풀이 (0) | 2023.01.09 |