이 문제는 목표지점에서 모든 지점의 최단거리를 BFS를 통해 찾아주면 되는 문제이다.
입력으로 2를 받으면 그 좌표를 기준으로 너비우선탐색을 진행해 준다.
문제해결방법
1. arr와 visited배열을 선언해 준다.
2. queue를 선언하고 입력으로 2를 받은 지점을 큐에 넣어준다.(큐에는 x, y, distance와 같은 정보가 필요하다)
3. 큐가 빌 때까지 탐색을 진행한다.
4. 출력은 arr의 내부 값을 출력하면 된다.(단 visited가 0이고 arr가 1이라면 이곳은 탐색이 불가능한 곳으로 간주해서 -1을 출력한다. 왜?? 방문을 하지 못했기 때문)
#include <iostream>
#include <queue>
using namespace std;
int arr[1001][1001];
int visited[1001][1001];
int dx[4] = { 0,0,-1,1 };
int dy[4] = { -1,1,0,0 };
struct data1
{
int x;
int y;
int distance;
};
queue<data1> Q;
int main(void)
{
int n = 0;
int m = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> arr[i][j];
if (arr[i][j] == 2)
{
data1 temp = { i,j,0 };
Q.push(temp);
arr[i][j] = 0;
}
}
}
while (!Q.empty())
{
data1 temp = Q.front();
Q.pop();
for (int i = 0; i < 4; i++)
{
if (temp.x + dx[i] >= 0 && temp.y + dy[i] >= 0 && temp.x + dx[i] < n && temp.y + dy[i] < m && visited[temp.x + dx[i]][temp.y + dy[i]] == 0 && arr[temp.x + dx[i]][temp.y + dy[i]] == 1)
{
arr[temp.x + dx[i]][temp.y + dy[i]] = temp.distance + 1;
visited[temp.x + dx[i]][temp.y + dy[i]] = 1;
data1 temp2 = { temp.x + dx[i],temp.y + dy[i],temp.distance + 1 };
Q.push(temp2);
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (arr[i][j] == 1)
{
if (visited[i][j] == 0)
{
cout << -1 << " ";
}
else
{
cout << 1 << " ";
}
}
else
{
cout << arr[i][j] << " ";
}
}
cout << endl;
}
return 0;
}
'백준 > 실랜디, 골랜디' 카테고리의 다른 글
[백준] 좋다(1253) (0) | 2025.01.08 |
---|---|
[백준] C++ 부분합(1806) (0) | 2025.01.08 |
[백준] C++ RGB거리(1149) (0) | 2024.12.28 |
[백준] C++ 좌표압축(18870) (0) | 2024.12.27 |
[백준] C++ AC(5430) (1) | 2024.12.27 |