백준/BFS
백준 2178번 미로 탐색 (c++)
Daekyue
2023. 11. 4. 22:12
[Silver I] 미로 탐색 - 2178
분류
너비 우선 탐색, 그래프 이론, 그래프 탐색
문제 설명
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개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
코드
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int board[102][102];
int vis[102][102];
string row;
int n, m;
int nx[4] = {1, 0, -1, 0};
int ny[4] = {0, 1, 0, -1};
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> row;
for (int j = 0; j < m; j++) {
board[i][j] = row[j] - '0';
}
}
queue<pair<int, int>> Q;
Q.push({0, 0});
vis[0][0] = 1; // 기본 BFS 구조에 1을 대입하던것 대신 해당 좌표까지 거리를 넣어준다
while (!Q.empty()) {
pair<int, int> cur = Q.front();
Q.pop();
for (int i = 0; i < 4; i++) {
int tx = cur.X + nx[i];
int ty = cur.Y + ny[i];
if (tx < 0 || ty < 0 || tx >= n || ty >= m)
continue;
if (board[tx][ty] != 1 || vis[tx][ty])
continue; // if문에서는 vis == 1로 체크하는 대신 vis가 양수라면
// 방문한 적이 있는 것으로 체크하도록 하였다
Q.push({tx, ty});
vis[tx][ty] = vis[cur.X][cur.Y] + 1; // 상하좌우 이동 시 거리가 다 1씩 증가해야 하기에
}
}
cout << vis[n - 1][m - 1]; // n,m의 거리를 알기 위해
}