백준/완전 탐색

[백준 2589번 / C++] 보물섬

배발자 2022. 1. 14.

목차

    반응형

    완전 탐색 문제이다. 

     

    먼저 map이 [3][4] 배열로 주어진다면 {0,0} ~ {2,3} 까지 총 12개의 좌표값을 하나하나 현위치로 판단해서 갈 수 있는 최대 거리를 구하라는 것이다.  

     

    즉, bfs() 를 활용해서 현위치에서 바다가 아닌 육지로 갈 수 있는 거리를 계속해서 갱신하고 최댓값을 구해나가는 것이다. 

     

    map[3][4]가 주어진다고 가정을 하고, "W = 0 , L = 1" 라고 보기 쉽게 숫자로 표현하였다.

    그리고 map 크기만큼 check 라는 배열을 생성 해준다.

     

    먼저 {0,3} 지점을 먼저 살펴보자. 

    다음 그림을 보면 현위치에서 갈 수 있는 길이 있을 때마다 숫자를 갱신해나간다. 

    모든 맵을 다 살펴보고 나면 최댓값이 3이라는 것을 알 수 있다. 그렇기 때문에  result라는 표에서 {0,3} 지점에서의 숫자는 {0,3}라는 현위치에서 갈 수 있는 최대 거리라고 생각하면 된다. 

     

    실제 구현에서는 result 배열을 따로 생성하지 않고 최댓값인지 비교를 해서 구현을 하였다. 

    또한, 첫 시작점의 거리값을 1로 설정을 해두었기 때문에 결과를 출력할 때는 result-1 을 출력하도록 하였다. 

    [백준 2589번 / C++] 보물섬

     

    
      
    #include <iostream>
    #include <queue>
    #include <tuple>
    using namespace std;
    int map[50][50];
    int check[50][50];
    int dx[4] = { 0,0,1,-1 };
    int dy[4] = { 1,-1,0,0 };
    int h, w;
    int result = -1;
    queue <pair<int, int>> q;
    void bfs() {
    int x, y, nx, ny;
    while (q.size()) {
    tie(y, x) = q.front();
    q.pop();
    for (int i = 0; i < 4; i++) {
    nx = x+ dx[i];
    ny = y+ dy[i];
    if (nx < 0 || nx >= w || ny < 0 || ny >= h)continue; //map 범위 넘었을 때
    if (map[ny][nx] == 0 || check[ny][nx])continue; //바다거나 이미 체크된곳이면
    check[ny][nx] = check[y][x] + 1;//현지점+1 값을 조건 만족시 상하좌우에 갱신.
    result = max(check[ny][nx], result); //result 값 비교해서 최댓값이면 갱신.
    q.push({ ny,nx }); //queue에 다시 집어넣기
    }
    }
    }
    int main() {
    cin >> h >> w;
    for (int i = 0; i < h; i++) {
    string s = ""; cin >> s;
    for (int j = 0; j < w; j++) {
    if (s[j] == 'W')map[i][j] = 0;
    else map[i][j] = 1;
    }
    }
    for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
    if (map[i][j] == 1) {
    check[i][j] = 1;
    q.push({ i,j });
    bfs();
    for (int k = 0; k < h; k++) {
    for (int z = 0; z < w; z++) {
    check[k][z] = 0;
    }
    }
    }
    }
    }
    cout << result-1;
    }
     

    2589번: 보물섬

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

    www.acmicpc.net

     

    반응형

    '백준 > 완전 탐색' 카테고리의 다른 글

    [백준 2529번 / C++] 부등호  (0) 2022.02.19
    [백준 1107번 / C++] 리모컨  (0) 2022.02.14
    [백준 14502번 / C++] 연구소  (0) 2022.01.28
    [백준 14620번 / C++] 꽃길  (0) 2022.01.25
    [백준 1189번 / C++] 컴백홈  (0) 2022.01.25

    댓글