백준 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;
}