알고리즘/백준

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

녕이 2022. 2. 10. 00:02
728x90

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

 

2178번: 미로 탐색

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

www.acmicpc.net

 

문제 요약

 

N x M크기의 미로

1 : 이동할 수 있는 칸  0 : 이동할 수 없는 칸

(1, 1)에서 출발해 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하라

서로 인접한 칸으로만 이동 가능

(칸을 셀 때, 시작 위치와 도착 위치도 포함)

 

 

범위

 

N, M(2 ≤ N, M ≤ 100)

각각의 수들은 붙어서 입력으로 주어진다.

 

 

 


 

이동 가능한 방향은 인접칸으로만 가능하므로 상하좌우

dis 배열을 통해 이동횟수를 더하고 초기값을 0으로 해서 만약 0이 아니라면 방문한 것으로도 체크할 수 있도록 했다.

입력된 값이 붙어서 주어졌기 때문에 문자열로 받아서 정수형으로 변경해 miro 배열에 넣어줬다. 

(이 부분은 그냥 char[][] 2차원 배열로 받아도 된다. 뒤늦게 알아차린..)

 

 

BFS를 통해 최소 이동 횟수를 구할 수 있다. 이동한 좌표가

 

- 범위 밖

- 이동불가한 곳 (0)

- 방문한 곳

 

를 제외한 곳이라면 이동할 수 있다.

 

#include <iostream>
#include <queue>
using namespace std;
int n, m, miro[101][101];
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int dis[101][101];
string s;

void input(){
    cin >> n >> m;
    for(int i=0; i<n; i++){
        cin >> s;
        for(int j=0; j<m; j++) miro[i+1][j+1] = s[j] - '0';
    }
}

void BFS(){
    queue<pair<int, int>> q;
    q.push({1, 1}); //출발 위치
    dis[1][1] = 1;
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for(int i=0; i<4; i++){
            int dx = x + dir[i][0];
            int dy = y + dir[i][1];
            if(dx < 1 || dy < 1 || dx > n || dy > m) continue; //범위 밖 - 패스
            if(miro[dx][dy] == 0) continue; //이동불가한 곳 - 패스
            if(dis[dx][dy] != 0) continue; //방문한 곳 - 패스
            dis[dx][dy] = dis[x][y] + 1;
            q.push({dx, dy});
        }
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    input();
    BFS();
    cout << dis[n][m] << '\n';
    return 0;
}

 

 

 

 

 

 

 

💡공부 및 기록용 블로그이므로 오류가 있을 수 있습니다.💡

만약 문제에 오류나 오타가 있다면 댓글로 알려주세요
언제나 환영합니다. 감사합니다. 화이팅!

 

 

 

 

728x90