알고리즘/PS - 백준

[백준 2178 - C++] 미로 탐색 : BFS

excited-hyun 2021. 4. 10. 22:26
반응형

www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

문제

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

 

입력

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

 

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

 

 

풀이

BFS알고리즘을 이용하여 풀이하였다.

처음엔 메모리 초과가 나서 왜지 ?! 했는데 방문 여부를 확인할 때 사용하는 visited배열을 적절한 위치에서 1로 바꿔주지 않아서 였다. 큐에 push해줄 때 마다 1로 만들어 줬어야 했는데 실수 했다ㅠㅠㅠ

 

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

char map[101][101];
int visited[101][101];
queue<pair<pair<int, int>, int>> check;

int X[4] = {1, -1, 0, 0};
int Y[4] = {0, 0, 1, -1};

int main(void){
    int n, m;
    int x, y, n_x, n_y;
    int cnt;
    int result= -1;
    scanf("%d %d", &n, &m);
    for(int i=0; i<n; i++){
        scanf("%s", map[i]);
    }
    
    check.push(make_pair(make_pair(0, 0), 1));
    visited[0][0] = 1;
    
    while(!check.empty()){
        x = check.front().first.first;
        y = check.front().first.second;
        cnt = check.front().second;
        
        check.pop();
        if(x == n-1 && y == m-1){
            result = cnt;
            break;
        }
        for(int i=0; i<4; i++){
            n_x = x+X[i];
            n_y = y+Y[i];
            if(n_x < 0 || n_x >= n || n_y < 0 || n_y >= m)
                continue;
            if(map[n_x][n_y] == '0' || visited[n_x][n_y] == 1)
                continue;
            check.push(make_pair(make_pair(n_x, n_y), cnt+1));
            visited[n_x][n_y] = 1;
        }
    }
    printf("%d\n", cnt);
    
}
728x90
반응형