본문으로 건너뛰기

백준 2178 미로 탐색 C++ 문제 풀이

풀이

접근

(1,1) 좌표에서 (N,M) 좌표까지 이동하기 위해 필요한 최소 칸 수를 구해야 합니다.

BFS 또는 DFS 기법을 통해 탐색을 해야 합니다.

일반적인 완전 탐색의 조건은 아래와 같습니다.

  • 문제 요구사항에 만족하는 범위에 위치
  • 좌표의 값이 0이 아니며
  • 처음 방문

문제 특성 상 (1,1)좌표를 제외하고 좌표의 값이 1인 경우일 때, 무조건 처음 방문하는 좌표입니다. 따라서 처음 방문하는 좌표를 계속 탐색하며 값을 갱신해 주면 됩니다.

이 문제는 BFS로 풀이해야 합니다. DFS로 푸는 것은 올바르지 않습니다.

솔루션

#include <iostream>
#include <vector>
#include <string>
#include <queue>

using namespace std;
int N, M;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
vector <vector <int> > MAP(101, vector<int>(101, 0));
vector <vector <bool> > VISITED(101, vector<bool>(101, false));

void bfs() {
queue <pair<int, int> > Q;
Q.push(make_pair(0 ,0));
VISITED[0][0] = true;

while(!Q.empty()) {
int x = Q.front().first;
int y = Q.front().second;

Q.pop();

for(int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];

if(nx < 0 || nx >= N || ny < 0 || ny >= M) {
continue;
}

if(MAP[nx][ny] == 0 || VISITED[nx][ny]) {
continue;
}

VISITED[nx][ny] = true;
MAP[nx][ny] = MAP[x][y] + 1;
Q.push(make_pair(nx, ny));
}
}
}

int main() {
cin >> N >> M;
for(int n=0; n<N; n++) {
string str; cin >> str;
for(int m=0; m<M; m++) {
MAP[n][m] = str[m] - '0';
}
}

bfs();

cout << MAP[N-1][M-1];

return 0;
}

참고 자료