본문 바로가기

백준/BFS

백준 2178번 미로 탐색 (c++)

 

[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의 거리를 알기 위해
}

'백준 > BFS' 카테고리의 다른 글

백준 1697번 숨바꼭질 (c++)  (0) 2023.11.06
백준 7576 - 토마토(c++)  (0) 2023.11.04
백준 1926번 그림 (C++)  (0) 2023.11.04