https://velog.io/@skyepodium/%EB%B0%B1%EC%A4%80-16236-%EC%95%84%EA%B8%B0-%EC%83%81%EC%96%B4
백준 16236 아기 상어
문제 아기 상어가 물고기를 잡아 먹을 수 있는 시간을 구하는 문제 ~으아 문제가 정말 길어요~ 1. n 공간의 크기 (2 = n = 20) 2. 지도의 크기 n * n, (1 * 1 에는 최대 물고기가 1마리 있습니다.) 3. 상어,
velog.io
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int N, s_x, s_y;
static int[][] xy;
static int[][] cnt;
static int[] x_move = {-1,1,0,0};
static int[] y_move = {0,0,-1,1};
static int shark = 2;
public static void main(String arg[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
xy = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < N; j++) {
int a = Integer.parseInt(st.nextToken());
xy[i][j] = a;
if(a == 9) {
s_x = i;
s_y = j;
xy[i][j] = 0;
}
}
}
int result = 0;
int feed = 0;
while(true) {
cnt = new int[N][N];
int start = s_x;
int end = s_y;
int time = bfs(s_x, s_y);
if(start != s_x || end != s_y) { //시작점이 바뀌었다면 물고기를 먹은 것
result += time;
feed++; //먹이를 먹음
if(shark == feed) { //크기만큼 먹이를 먹었으면
shark++;
feed = 0;
}
}
else if(s_x == start && s_y == end) { //먹을 수 있는 물고기가 없음
break;
}
}
System.out.println(result);
}
static int bfs(int sx, int sy) {
LinkedList<Point> que = new LinkedList<>();
que.add(new Point(sx, sy));
int min_dist = 401;
int min_x = 21;
int min_y = 21;
while(!que.isEmpty()) {
Point point = que.poll();
for(int i = 0; i < 4; i++) {
int tx = point.x + x_move[i];
int ty = point.y + y_move[i];
if(tx >= 0 && tx < N && ty >= 0 && ty < N && xy[tx][ty] <= shark) {
if(cnt[tx][ty] == 0 || cnt[tx][ty] > cnt[point.x][point.y] + 1) { //tx ty 좌표까지 오는 시간이 기존의 시간보다 짧다면
cnt[tx][ty] = cnt[point.x][point.y] + 1;
que.add(new Point(tx, ty));
if(xy[tx][ty] != 0 && xy[tx][ty] < shark) { //먹을 수 있는 물고기가 있으면
if(min_dist > cnt[tx][ty]) { //기존의 최소 거리보다 더 짧은 거리의 물고기가 있다면
min_dist = cnt[tx][ty];
min_x = tx;
min_y = ty;
}
else if(min_dist == cnt[tx][ty]) {
if(min_x > tx) { //거리가 가까운 물고기가 많다면 가장 위에 있는 물고기
min_x = tx;
min_y = ty;
}
else if(min_x == tx) { //그러한 물고기가 여러마리라면
if(min_y > ty) {
min_x = tx;
min_y = ty;
}
}
}
}
}
}
}
}
//먹을 물고기를 찾았으면 물고기를 없얘고 물고기가 있는 좌표를 시작점으로 다시 탐색해야함
if(min_x == 21 || min_y == 21) {
return 0;
}
xy[min_x][min_y] = 0;
s_x = min_x;
s_y = min_y;
return min_dist;
}
}
'백준' 카테고리의 다른 글
[백준] 1629 곱셈 [자바] (0) | 2022.04.22 |
---|---|
[백준] 1043 거짓말 [자바] (0) | 2022.04.21 |
[백준] 16928 뱀과 사다리 게임 [자바] (0) | 2022.04.16 |
[백준] 10026 적록색약 [자바] (0) | 2022.04.13 |
[백준] 6064 카잉 달력 [자바] (0) | 2022.04.13 |