알고리즘/백준

[백준/C,C++] 2178번: 미로 탐색

이민훈 2021. 4. 20. 08:53

www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

풀이

간단한 BFS 문제입니다.

 

이동 가능한 방향은 최대 4방향(상, 하, 좌, 우)이며,

 

BFS로 0을 제외한 모든 노드에 대해 깊이를 계산해 준 후에

 

(N, M)의 깊이를 출력해 주면 됩니다.

 

 

유의해야 할 점은 모든 노드에서 4방향(상, 하, 좌, 우)으로 이동할 수 있는 것은 아니기에

 

해당 방향으로 갈 수 있는지, 해당 방향의 노드가 갈 수 있는 지점(1이면 가능, 0이면 불가능)인지 체크하고,

 

방문했던 곳인지를 체크해주면 됩니다.

 

#include<iostream>
#include<queue>

using namespace std;

const int MAX = 100;

#define py first
#define px second

int n, m;
string maze[MAX];
bool visited[MAX][MAX];
queue<pair<int, int>> q;
pair<int, int> d[4] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
int res[MAX][MAX];

void visit(int y, int x)
{
    visited[y][x] = true;
    q.push(pair(y, x));
}

void BFS()
{
    visit(0, 0);

    while (!q.empty()) {
        pair<int, int> node = q.front();
        q.pop();
        for (int i = 0; i < 4; i++) {
            int ny = node.py + d[i].py;
            int nx = node.px + d[i].px;
            if (ny >= 0 && nx >= 0 && ny < n && nx < m) {
                if (!visited[ny][nx] && maze[ny][nx] != '0') {
                    visit(ny, nx);
                    res[ny][nx] = res[node.py][node.px] + 1;
                }
            }
        }
    }
}

int main(void)
{
    cin >> n >> m;

    for (int i = 0; i < n; i++) {
        cin >> maze[i];
    }

    BFS();

    if (n > 1 && m > 1) cout << res[n - 1][m - 1] + 1;

    return 0;
}

반례

Input

2 2

11

11

Output

3

 

Input

5 5
10011
11110
11001
11111
11101

Output

9