IDEA
(0,0) 에서 (N,M)까지 장애물을 피해 갈 수 있는 최단 거리를 묻는 문제다.
내 머릿속은 최단거리 = BFS 때문에 BFS로 풀었다.
최단거리를 묻는 문제 같은 경우 따로 VISITED를 사용하지 않고 MAP자체에 거리를 업데이트해준다.
맨 처음 시작점인 0,0을 큐에 넣어준다.
큐의 front를 기준으로 상하좌우 4방향의 map값을 확인한다.
map이 0이라면 갈 수 없고, 1이 아니라면 이미 지나온 곳이라는 뜻이다.
그렇기에 새로운 좌표 nx,ny가 범위 내에 있으면서 map값이 1이면 큐에 넣을 수 있다.
이때 nx,ny까지의 거리는 x,y까지의 거리 + 1 이므로 map 값을 업데이트시켜준다.
문제에서 무조건 n.m으로 이동할 수 있다고 했기때문에 bfs의 반복문이 끝난 후 map[n-1][m-1]값을 반환해준다.
코드
#include <iostream>
#include <vector>
#include <queue>
#include<algorithm>
using namespace std;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
int n, m;
int arr[100][100] = {0};
queue<pair<int, int>>q;
bool check(int x, int y) {
if (-1 < x && x < n && -1 < y && y < m) return true;
return false;
}
int bfs() {
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 (check(nx, ny) && arr[nx][ny] == 1) {
arr[nx][ny] = arr[x][y] + 1;
q.push({ nx,ny });
}
}
}
return arr[n-1][m-1];
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%1d", &arr[i][j]);
}
}
q.push({ 0,0 });
printf("%d" , bfs());
}
'알고리즘 > 백준 단계별로 풀기 (12.26 ~ 12.31)' 카테고리의 다른 글
이분탐색 - 백준 1300번 k번째 수✨ (0) | 2020.12.27 |
---|---|
우선순위 큐 - 백준 11279번 최대 힙 & 백준 1927번 최소 힙 (0) | 2020.12.27 |
BFS & DFS - 백준 1012번 유기농 배추 (0) | 2020.12.27 |
큐 - 백준 1966번 프린터 큐 (0) | 2020.12.27 |
큐 - 백준 1186번 요세푸스 문제0 (0) | 2020.12.27 |