백준 2178. 미로 탐색
조건
N×M 크기 배열의 미로
2 ≤ N, M ≤ 100
길은 1 벽은 0
왼쪽 위에서 오른쪽 아래로 가는 최단거리
항상 갈 수 있는 경우만 입력됨
생각
bfs를 돌려서 최단거리 보장
좌표와 동시에 깊이를 저장
오른쪽 아래에 도달하면 탐색 중단
n-1, m-1 일때 깊이를 리턴
*벡터 for문으로 간단히 순회하는 방법 (C++11부터)
ranged for loop
for (vector<int> vec : arr) {
for (int n : vec)
}
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)
}