본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 1462 보물섬

by 까망 하르방 2021. 2. 27.
반응형

출처: http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=734&sca=30

 Input 

5 7

WLLWWWL

LLLWLLL

LWLWLWW

LWLWLLL

WLLWLWW

 

 Output 

8

- 육지가 바다로 나눠져 있다면 육지간 이동은 불가능합니다.

- 연결된 육지에서 최단거리로 이동하되 가장 멀리 있는 곳의 거리를 찾는 문제입니다. → BFS

- 육지(L)에 해당하는 모든 지점에서 이동할 수 있는 가장 먼거리를 찾습니다. (초기화 유의)

  즉, 『L』로 표시된 모든 지점을 출발점으로 BFS 탐색하며 가장 멀리 도달한 거리를 찾습니다.

- 특정 위치 (x, y)에서 출발 했을 때, visited[i][j] = (i, j)에 도달하기 위한 최단 거리

   BFS 탐색이 끝난 후 매번 visited[][]에 저장된 값 중 최대값을 구합니다.


#include <stdio.h>
 
inline int max(int A, int B) { if (A > B) return A; return B; }
const int INF = 2e9;
const int MAX_NM = 50 + 5;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
int N, M, ans;
char map[MAX_NM][MAX_NM];
int visited[MAX_NM][MAX_NM];
struct Node{
    int x, y, cost;
}que[MAX_NM * MAX_NM * 4];
int fr, re;
 
void init() {
    fr = re = 0;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            visited[i][j] = INF;
        }
    }
}
 
void BFS(int x, int y) {
    init();
    que[re++] = {x, y, 0};
    visited[x][y] = 0;
    while (fr < re) {
        Node cur = que[fr++];
        
        for (int i = 0; i < 4; ++i) {
            int nextX = cur.x + dx[i];
            int nextY = cur.y + dy[i];
 
            if (nextX < 0 || nextY < 0 || nextX >= N || nextY >= M)
                continue;
            if (map[nextX][nextY] == 'W')
                continue;
            int nextCost = cur.cost + 1;
            if (visited[nextX][nextY] <= nextCost)
                continue;
            
            visited[nextX][nextY] = nextCost;
            que[re++] = { nextX, nextY, nextCost };
        }
    }
 
    // visited[][]에 저장된 값 중 최대값(최단거리 중 가장 먼 곳)
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            if (visited[i][j] != INF)
                ans = max(ans, visited[i][j]);
        }
    }
}
 
int main() {
    // freopen("input.txt", "r", stdin);
    scanf("%d %d", &N, &M);
    for (int i = 0; i < N; ++i) {
        scanf("%s", map[i]);
    }
 
    // 육지(L)에 해당하는 지점
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            if (map[i][j] == 'L') {
                BFS(i, j);
            }
        }
    }
    
    printf("%d\n", ans);
}

 

반응형

'PS 문제 풀이 > Jungol' 카테고리의 다른 글

[Jungol] 정올 1840 치즈  (2) 2021.02.27
[Jungol] 정올 1106 장기  (0) 2021.02.27
[Jungol] 정올 3008 교통수단 선택하기  (0) 2021.02.27
[Jungol] 정올 3109 숫자 야구2  (0) 2021.02.27
[Jungol] 정올 3031 인형정리  (0) 2021.02.27

댓글