반응형
난이도: Silver 2
번호: 17086
생성일: March 3, 2023 7:26 PM
알고리즘 분류: 그래프 이론, 그래프 탐색, 너비 우선 탐색, 브루트포스 알고리즘
알고리즘, 자료 구조: Memoization
언어: C++
C++
BFS+ Memoization
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int N, M, maxDistToShark = -1;
bool map[51][51];
bool vst[51][51];
int memo[51][51]; // 메모이제이션 배열
const int dX[] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dY[] = {0, -1, -1, -1, 0, 1, 1, 1};
void reset_vst()
{
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
vst[i][j] = false;
}
int BFS(int i, int j)
{
// 이미 계산된 값이 있다면 바로 반환
if (memo[i][j] != -1) return memo[i][j];
reset_vst();
queue<pair<int, int>> Q;
int curDist = 1;
Q.push({i, j});
vst[i][j] = true;
while (!Q.empty())
{
int len = Q.size();
for (int l = 0; l < len; l++)
{
auto cur = Q.front();
Q.pop();
for (int k = 0; k < 8; k++)
{
int x = dX[k] + cur.first;
int y = dY[k] + cur.second;
if (x < 0 || y < 0 || x >= N || y >= M)
continue;
if (vst[x][y])
continue;
if (map[x][y] == 1)
{
// 메모이제이션 배열에 저장하고 최대 거리 갱신
memo[i][j] = curDist;
maxDistToShark = max(curDist, maxDistToShark);
return memo[i][j];
}
vst[x][y] = true;
Q.push({x, y});
}
}
curDist++;
}
// 메모이제이션 배열에 저장하고 반환
memo[i][j] = curDist - 1;
return memo[i][j];
}
int main(void)
{
cin.tie(0)->sync_with_stdio(0);
cout.tie(0);
cin >> N >> M;
// 배열 입력 받기
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
cin >> map[i][j];
// 메모이제이션 배열 초기화
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
memo[i][j] = -1;
// 모든 빈 칸에 대해서 BFS 알고리즘 수행
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (map[i][j] == 0)
BFS(i, j);
// 가장 먼 거리 출력
cout << maxDistToShark;
return (0);
}
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ 25416] 빠른 숫자 탐색 C++ (0) | 2023.03.04 |
---|---|
[BOJ 1697] 숨바꼭질 C++ (0) | 2023.03.04 |
[BOJ 1806] 부분합 C++ (0) | 2023.03.03 |
[BOJ 4195] 친구 네트워크 C++ (0) | 2023.03.02 |
[BOJ 1652] 누울 자리를 찾아라 C++ (0) | 2023.03.01 |