본문 바로가기
BaekJoon/C++

2589 : 보물섬 (C++)

by GrayChoi 2021. 2. 24.
반응형

 

2589번: 보물섬

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

www.acmicpc.net


먼저 바다인 칸은 visit배열에 방문표시를 해놓고 접근하지 못하도록 한다.

칸을 한개씩 한개씩 검사하며 육지인칸이 나온다면 그 육지인 칸에서 BFS탐색을 실행하여

가장 긴 시간이 걸리는 길을 탐색하여 저장해서 결과값을 낸다.

#include<iostream>
#include<queue>
#include<string>
#include<cstring>

using namespace std;

char map[50][50];
int map_search[50][50];
bool visit[50][50];
bool visit_search[50][50];

int N, M;
int result;
int maxi;

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

queue<pair<int, int>> q;

void bfs(int x, int y) {
    result = 0;
    visit_search[x][y] = true;

    while(!q.empty()) {
        x = q.front().first;
        y = q.front().second;
        q.pop();
        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx >= 0 && nx < N && ny >= 0 && ny < M) {
                if(map[nx][ny] == 'L' && visit_search[nx][ny] == false) {
                    // 육지이면서 방문하지 않았을 때 탐색 실행
                    q.push({nx, ny});
                    visit_search[nx][ny] = true;
                    map_search[nx][ny] = map_search[x][y] + 1;

                    if(map_search[nx][ny] > result) {
                        result = map_search[nx][ny];
                        // 이동하는 데 있어 가장 긴 시간이 걸리는 두 곳의 거리 최단거리 저장
                    }
                }
            }
        }
    }
}

int main() {
    cin >> N >> M;

    for(int x = 0; x < N; x++) {
        string temp;
        cin >> temp;
        for(int y = 0; y < M; y++) {
            map[x][y] = temp[y];
            if(map[x][y] == 'W') {
                // 바다 일 때 방문표시
                visit[x][y] = true;
            }
        }
    }


    // 완전탐색
    for(int x = 0; x < N; x++) {
        for(int y = 0; y < M; y++) {
            if(map[x][y] == 'L') {
                // L인 경우 bfs탐색을 실행하여 각각 초기화 해준 후 최단거리를 구해낸다.
                memcpy(visit_search, visit, sizeof(visit)); // 바다를 표시해준 배열을 복사해줌
                memset(map_search, 0, sizeof(map_search));  // 최단거리 값을 구하기 위한 배열, bfs탐색을 위해 0으로 초기화
                q.push({x, y});
                bfs(x, y);
                maxi = result > maxi ? result : maxi;
                // 육지 두 곳의 최단거리중 가장 큰 값을 저장한다.
            }
        }
    }

    cout << maxi << "\n";

    return 0;
} 
반응형

'BaekJoon > C++' 카테고리의 다른 글

11286 : 절댓값 힙 (C++)  (0) 2021.02.25
5928 : Contest Timing (C++)  (0) 2021.02.24
1927 : 최소 힙 (C++)  (0) 2021.02.24
11279 : 최대 힙 (C++)  (0) 2021.02.24
2638 : 치즈 (C++)  (0) 2021.02.22

댓글