전형적인 bfs 문제이당
package self_study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class bj7576_토마토 {
static int map[][];
static boolean visited[][];
static int N, M;
static int res;
static Queue <Data> q;
// 상 하 좌 우
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
static class Data {
int x;
int y;
int day;
public Data(int x, int y, int day) {
this.x = x;
this.y = y;
this.day = day;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
map = new int [N][M];
visited = new boolean [N][M];
q = new LinkedList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == 1) { // 토마토가 있는 위치라면
// 방문체크하고 큐에 넣어주기
visited[i][j] = true;
q.offer(new Data(i, j, 0));
} else if(map[i][j] == -1) {
visited[i][j] = true;
}
}
}
Data cur = null;
while(!q.isEmpty()) {
cur = q.poll();
res = cur.day;
for(int dir = 0; dir < 4; dir++) {
int nx = cur.x + dx[dir];
int ny = cur.y + dy[dir];
if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if(visited[nx][ny] == true || map[nx][ny] == -1) continue;
visited[nx][ny] = true;
q.offer(new Data(nx, ny, cur.day + 1));
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(!visited[i][j]) {
res = -1;
break;
}
}
}
System.out.println(res);
}
}
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 16953 A -> B (Java 자바) (0) | 2021.03.28 |
---|---|
백준 2206 벽 부수고 이동하기 (Java 자바) (0) | 2021.03.26 |
백준 2579 계단 오르기 (Java 자바) (0) | 2021.03.24 |
SWEA 암호문 1: 자바 (0) | 2021.02.08 |
SWEA 9229 한빈이의 spot mart (Java 자바) (0) | 2021.02.08 |