import java.util.*;
public class Main
{
static final int INF = 987654321;
static int N;
static int Map[][] = new int[20][20];
static int Dr[] = {-1, 1, 0, 0};
static int Dc[] = {0, 0, -1, 1};
static class Point {
int r, c, d;
Point (int r, int c, int d){
this.r = r;
this.c = c;
this.d = d;
}
}
static int solve(int r, int c) {
int ret = 0; // 이동하는 시간
int size = 2, cnt = 2;// 상어 크기, 크기 0 되면 사이즈 업
Point minPt = new Point(r, c, 0);
do { //BFS 로직
boolean visited[][] = new boolean[20][20];
Queue<Point> myqueue = new LinkedList<Point>();
visited[minPt.r][minPt.c] = true;
myqueue.add(new Point(minPt.r, minPt.c, 0));
minPt.d = INF;
while(myqueue.peek() != null){
Point curr = myqueue.poll();
if (curr.d > minPt.d) break; // 더 이상 진행할 물고기 없다는 뜻
if (Map[curr.r][curr.c] > size) continue;
if (Map[curr.r][curr.c] != 0 && Map[curr.r][curr.c] < size){
if(curr.d < minPt.d){
minPt = curr;
}else if (curr.d == minPt.d){
if(curr.r < minPt.r){
minPt = curr;
}else if (curr.r == minPt.r && curr.c < minPt.c){
minPt = curr;
}
continue;
}
}
for(int i = 0; i < 4; ++i){
int nr = curr.r + Dr[i], nc = curr.c + Dc[i];
if (nr < 0 || nr > N - 1 || nc < 0 || nc > N - 1) continue;
if (visited[nr][nc]) continue;
visited[nr][nc] = true;
myqueue.add(new Point(nr, nc, curr.d + 1));
}
}
if(minPt.d != INF){
ret += minPt.d;
--cnt;
if (cnt == 0){
++size;
cnt = size;
}
Map[minPt.r][minPt.c] = 0;
}
} while(minPt.d != INF);
return ret;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
int srow = 0, scol = 0; // shark 위치
for (int i = 0; i < N; ++i){
for (int j = 0; j < N; ++j){
Map[i][j] = sc.nextInt();
if (Map[i][j] == 9){
srow = i;
scol = j;
Map[i][j] = 0;
}
}
}
System.out.println(solve(srow, scol));
}
}
bfs 문제이지만 심화된 버전이라고 볼 수 있다..
어려우니까 계속해서 추가로 볼 문제
'알고리즘' 카테고리의 다른 글
DFS 기본 알고리즘 (0) | 2022.09.28 |
---|---|
BFS 기본 알고리즘 (0) | 2022.09.25 |
[백준] 14500번 (java 자바) (0) | 2022.08.24 |
[백준] 9019번 (python 파이썬) (0) | 2022.08.21 |
[백준] 16928번(python 파이썬) (0) | 2022.08.18 |