ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1261] 알고스팟
    BOJ 2021. 10. 2. 18:04

    https://www.acmicpc.net/problem/1261

     

    1261번: 알고스팟

    첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

    www.acmicpc.net

    <문제>

    꽤 다양한 풀이가 있을 수 있는 문제이다.

    현재 위치를 정점으로 생각하면, 상하좌우로 연결된 그래프라고 생각할 수 있다.

    다음 정점이 0인경우, 가중치가 0인 간선이 존재하는 셈이고

    다음 정점이 1인경우, 가중치가 1인 간선이 존재하는 셈이다.

    문제를 이렇게 변형한다면

    1만개의 정점, 0 혹은 1의 가중치를 갖는 양방향 그래프에서 [1,1]->[M,N] 다익스트라로 해결이 가능하다.

     

    이를 조금더 개선한 방법중 하나가, 가중치가 0 혹은 1일때에 사용하는 특수한 형태의 bfs도 존재하는데,

    0-1bfs 테크닉을 사용하지 않아도 이 문제는 입력이 작은 관계로 일반적인 bfs로도 해결이 가능한 것으로 보인다.

     

    <소스코드>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <bits/stdc++.h>
    using namespace std;
    const int INF = INT_MAX;
    int n, m, dy[4= {010-1}, dx[4= {10-10}, a[101][101];
    queue<pair<intint>> q;
    int main(void) {
        int i, j;
        cin >> m >> n;
        string temp;
        for (i = 0; i < n; i++) {
            cin >> temp;
            for (j = 0; j < m; j++) {
                a[i][j] = temp[j] - '0';
            }
        }
        vector<vector<int>> dist(100vector<int>(100, INF));
        q.push({00});
        dist[0][0= 0;
        while (!q.empty()) {
            pair<intint> cur = q.front();
            q.pop();
            for (i = 0; i < 4; i++) {
                int y = cur.first + dy[i];
                int x = cur.second + dx[i];
                if (y < 0 || x < 0 || y >= n || x >= m) continue;
                if (a[y][x] == 0) {
                    if (dist[y][x] > dist[cur.first][cur.second]) {
                        dist[y][x] = dist[cur.first][cur.second];
                        q.push({y, x});
                    }
                } else if (a[y][x] == 1) {
                    if (dist[y][x] > dist[cur.first][cur.second] + 1) {
                        dist[y][x] = dist[cur.first][cur.second] + 1;
                        q.push({y, x});
                    }
                }
            }
        }
        cout << dist[n - 1][m - 1];
     
        return 0;
    }
    cs

    n : 행
    m : 열

     

    'BOJ' 카테고리의 다른 글

    [1059] 좋은 구간  (0) 2021.10.03
    [20056] 마법사 상어와 파이어볼  (0) 2021.10.02
    [9019] DSLR  (0) 2021.10.02
    [1697] 숨바꼭질  (0) 2021.10.01
    [9012] 괄호  (0) 2021.10.01

    댓글