PS

BOJ 2589 - 보물섬

728x90

www.acmicpc.net/problem/2589

 

2589번: 보물섬

보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서

www.acmicpc.net

 

전형적인 BFS 문제이다.

L 에 해당하는 지역만 탐색하게 하면서, 거리 배열을 따로 만들어둬서, 새 지역으로 이동할때 마다 거리를 갱신해주고, 최대 거리 값을 구하면 되는 문제다.

 

 

- c++

#include <bits/stdc++.h>
 
#define MAX 51
 
using namespace std;
 
char adj[MAX][MAX];
bool visited[MAX][MAX];
int depth[MAX][MAX]; // 거리 계산을 위한 배열 
int L, W, answer;
int dy[4= {-1100};
int dx[4= {00-11};
 
void bfs(int i, int j) {
    queue<pair<intint>> q;
    visited[i][j] = true;
    q.push({i, j});
 
    while(!q.empty()) {
        int y = q.front().first, x = q.front().second;
        q.pop();
        
        for (int i = 0; i < 4++i) {
            int ny = y + dy[i], nx = x + dx[i];
            
            if (ny < 0 || ny > L || nx < 0 || nx > W) continue;
            
            if (adj[ny][nx] == 'L' && !visited[ny][nx]) {
                visited[ny][nx] = true;
                q.push({ny, nx});
                
                depth[ny][nx] = depth[y][x] + 1;
                
                answer = max(answer, depth[ny][nx]);
            }
        }
    }
}
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> L >> W;
    
    char temp;
    for (int i = 1; i <= L; ++i) {
        for (int j = 1; j <= W; ++j) {
            cin >> temp;
            adj[i][j] = temp;
        }
    }
    
    for (int i = 1; i <= L; ++i) {
        for (int j = 1; j <= W; ++j) {
            if (adj[i][j] == 'L') {
                bfs(i, j);
                memset(visited, falsesizeof(visited));
                memset(depth, 0sizeof(depth));
            }
        }
    }
    
    cout << answer;
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 16562 - 친구비  (0) 2021.02.12
BOJ 2933 - 미네랄  (0) 2021.02.07
BOJ 17298 - 오큰수  (0) 2021.02.07
BOJ 2075 - N번째 큰 수  (0) 2021.02.05
BOJ 9328 - 열쇠  (0) 2021.02.05