백준
2178번 (silver 1)
이야기prog
2025. 1. 22. 23:01
https://www.acmicpc.net/problem/2178
BFS로 푸는 가장 보편적인 문제인 미로에서 최소거리 탐색문제이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void BFS(vector<vector<int>>&);
int main() {
cin.tie(0)->sync_with_stdio(false);
int N, M;
cin >> N >> M;
vector<vector<int>> arr(N + 2, vector<int>(M + 2, 0));
for (int i = 1; i <= N; ++i) {
string tmp;
cin >> tmp;
for (int j = 1; j <= M; ++j) {
arr[i][j] = tmp[j - 1] - '0';
}
}
BFS(arr);
cout << arr[N][M];
return 0;
}
void BFS(vector<vector<int>>& arr) {
queue<pair<int, int>> q({ make_pair(1,1) });
vector<vector<bool>> visit(arr.size(), vector<bool>(arr[0].size(), false));
int n = arr.size() - 2, m = arr[0].size() - 2;
while (!q.empty()) {
int i = q.front().first, j = q.front().second;
q.pop();
if (n == i && m == j) {
break;
}
if (visit[i + 1][j] == false && arr[i + 1][j] != 0) {
q.push(make_pair(i + 1, j));
arr[i + 1][j] = arr[i][j] + 1;
visit[i + 1][j] = true;
}
if (visit[i][j + 1] == false && arr[i][j + 1] != 0) {
q.push(make_pair(i, j + 1));
arr[i][j + 1] = arr[i][j] + 1;
visit[i][j + 1] = true;
}
if (visit[i - 1][j] == false && arr[i - 1][j] != 0) {
q.push(make_pair(i - 1, j));
arr[i - 1][j] = arr[i][j] + 1;
visit[i - 1][j] = true;
}
if (visit[i][j - 1] == false && arr[i][j - 1] != 0) {
q.push(make_pair(i, j - 1));
arr[i][j - 1] = arr[i][j] + 1;
visit[i][j - 1] = true;
}
}
}