득이공간
[백준 C++] 14940 쉬운 최단거리 - 너비우선탐색 본문
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net
#include <iostream>
#include <queue>
using namespace std;
int N, M;
int Map[1000][1000];
int Distance[1000][1000];
queue<pair<int, int>> SearchQueue;
void BFS(int StartRow, int StartCol)
{
SearchQueue.emplace(StartRow, StartCol);
while (!SearchQueue.empty())
{
int CurRow = SearchQueue.front().first;
int CurCol = SearchQueue.front().second;
SearchQueue.pop();
if (Map[CurRow][CurCol] == 0)
{
continue;
}
int CurDistance = Distance[CurRow][CurCol];
Map[CurRow][CurCol] = 0;
// Left
if (CurCol > 0
&& Map[CurRow][CurCol - 1] != 0)
{
Distance[CurRow][CurCol - 1] = CurDistance + 1;
SearchQueue.emplace(CurRow, CurCol - 1);
}
// Top
if (CurRow > 0
&& Map[CurRow - 1][CurCol] != 0)
{
Distance[CurRow - 1][CurCol] = CurDistance + 1;
SearchQueue.emplace(CurRow - 1, CurCol);
}
// Right
if (CurCol < M - 1
&& Map[CurRow][CurCol + 1] != 0)
{
Distance[CurRow][CurCol + 1] = CurDistance + 1;
SearchQueue.emplace(CurRow, CurCol + 1);
}
// Bottom
if (CurRow < N - 1
&& Map[CurRow + 1][CurCol] != 0)
{
Distance[CurRow + 1][CurCol] = CurDistance + 1;
SearchQueue.emplace(CurRow + 1, CurCol);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int StartRow = 0, StartCol = 0;
cin >> N >> M;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
cin >> Map[i][j];
if (Map[i][j] == 2)
{
StartRow = i;
StartCol = j;
}
}
}
BFS(StartRow, StartCol);
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
if (Map[i][j] == 1)
{
cout << -1 << ' ';
}
else
{
cout << Distance[i][j] << ' ';
}
}
cout << '\n';
}
}
너비 우선 탐색을 이용해서 목적지에서부터 모든 노드까지 각 깊이를 체크해주어 푸는 문제입니다.
이미 탐색된 노드는 다시 갈 수 없는 땅이므로 값을 0으로 바꿔주고
BFS가 완료된 시점에서 값이 1인 노드는 목적지로부터 도달할 수 없는 위치로써 -1을 출력하도록 했습니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 C++] 9375 패션왕 신해빈 - 조합론 (0) | 2024.02.15 |
---|---|
[백준 C++] 2579 계단 오르기 - 다이나믹프로그래밍 (0) | 2024.02.15 |
[백준 C++] 1074 Z - 분할정복 (0) | 2024.02.15 |
[백준 C++] 2630 색종이 만들기 - 분할정복 (0) | 2024.02.15 |
[백준 C++] 1927 최소 힙 - 우선순위큐 (0) | 2024.02.15 |