백준 2178. 미로 탐색


조건
N×M 크기 배열의 미로
2 ≤ N, M ≤ 100
길은 1 벽은 0
왼쪽 위에서 오른쪽 아래로 가는 최단거리
항상 갈 수 있는 경우만 입력됨

생각
bfs를 돌려서 최단거리 보장
좌표와 동시에 깊이를 저장
오른쪽 아래에 도달하면 탐색 중단
n-1, m-1 일때 깊이를 리턴


#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;

int dy[4] = { 1, -1, 0, 0 };
int dx[4] = { 0, 0, 1, -1 };

int bfs(queue< tuple<int, int, int> >& que, vector< vector<int> >& arr,
     vector< vector<int> >& visit, int n, int m)
{
 int depth = -1;
 que.push({ 0, 0, 1 });
 visit[0][0] = 1;
 while (!que.empty()) {
  int y = get<0>(que.front());
  int x = get<1>(que.front());
  depth = get<2>(que.front());
  que.pop();

  if (y == n - 1 && x == m - 1) break;
  for (int i = 0; i < 4; ++i) {
   int yy = y + dy[i];
   int xx = x + dx[i];
   if (yy >= 0 && yy < n && xx >= 0 && xx < m
    && arr[yy][xx] && !visit[yy][xx]) {
    que.push({ yy, xx, depth + 1 });
    visit[yy][xx] = 1;
   }
  }
 }
 return depth;
}

int main() {
 int n, m;
 queue< tuple<int, int, int> > que;
 scanf("%d %d", &n, &m);
 vector< vector<int> > arr(n, vector<int>(m));
 vector< vector<int> > visit(n, vector<int>(m, 0));
 for (int i = 0; i < n; ++i)
  for (int j = 0; j < m; ++j)
   scanf("%1d", &arr[i][j]);

 printf("%d", bfs(que, arr, visit, n, m));
}


*벡터 for문으로 간단히 순회하는 방법 (C++11부터)
ranged for loop

for (vector<int> vec : arr) {
for (int n : vec)
}

다음 글 이전 글
댓글 쓰기
comment url