알고리즘 : C++/BaekJoon
백준 2178번 - 미로 탐색
동 노이만
2023. 5. 20. 13:21
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
풀이 과정
1과 0으로 이루어진 미로의 (0, 0)에서 (n - 1, m - 1)까지 최단 거리를 구하는 문제이다. 이때 가중치가 1로 일정하므로 BFS를 사용해서 문제를 풀었다. QUEUE를 이용해 BFS를 구현할 때, 이전 visited + 1 을 해줌으로서 첫 노드와 탐색 노드의 거리를 구했다.
느낀 점
DFS를 주로 사용하다가 BFS를 사용하려하니 곧바로 코드가 생각나지 않았다. 하지만 큐와 4방향 탐색을 통해 찾아간다는 개념을 기반으로 천천히 구현하다보니 자연스럽게 구현되었다.
#include<bits/stdc++.h>
using namespace std;
int n, m;
char mp[101][101];
int visited[101][101];
int my[4] = { 1, 0, -1, 0 }, mx[4] = { 0, 1, 0, -1 };
void bfs(int y, int x) {
//큐생성과 초기값 할당
queue<pair<int, int>> q;
q.push({ y, x });
visited[y][x] = 1;
while (q.size()) {
for (int i = 0; i < 4; i++) { //4방향 탐색
int ny = q.front().first + my[i];
int nx = q.front().second + mx[i];
if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || mp[ny][nx] == '0') continue;
q.push({ ny, nx });
visited[ny][nx] = visited[q.front().first][q.front().second] + 1;
}
if(!q.empty()) q.pop();
}
return;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
//입력
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> mp[i][j];
}
}
//수행
bfs(0, 0);
//출력
cout << visited[n - 1][m - 1];
return 0;
}