오늘의 알고리즘

[C++] 백준 2468 안전 영역

하늘하늘 . 2022. 5. 13. 17:49
 
#include <iostream>
#include <algorithm>
#include <memory>
#include <queue>
#include <tuple>
 
int graph[101][101] = {};
bool visit[101][101] = {};
int DirX[4] = { 1, -1, 0, 0};
int DirY[4] = { 0, 0, 1, -1};
int N = 0;
int iMax = 0;
int iCount = 0;
std::queue<std::pair<int,int>> que = {};
 
void Check(int iNumber)
{
    iCount = 0;
 
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            if (graph[i][j] > iNumber && !visit[i][j])
            {
                ++iCount;
 
                que.push({ i,j });
 
                while (!que.empty())
                {
                    std::pair<int, int> pair = que.front();
                    int iX = pair.first;
                    int iY = pair.second;
                    que.pop();
 
                    if (iX >= 0 && iX < N &&
                        iY >= 0 && iY < N)
                    {
                        if (!visit[iX][iY])
                            visit[iX][iY] = true;
                        else
                            continue;
                    }
 
                    else
                        continue;
 
                    for (int z = 0; z < 4; ++z)
                    {
                        int iNextX = iX + DirX[z];
                        int iNextY = iY + DirY[z];
 
                        if (iNextX >= 0 && iNextX < N &&
                            iNextY >= 0 && iNextY < N)
                        {
                            if (!visit[iNextX][iNextY] &&
                                graph[iNextX][iNextY] > iNumber)
                                que.push({ iNextX, iNextY });
 
                            else
                                continue;
                        }
                    }
                }
            }
        }
    }
 
    iMax = std::max(iMax, iCount);
}
 
int main()
{
 
    std::cin >> N;
 
    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < N; ++j)
        {
            std::cin >> graph[i][j];
        }
    }
 
    for (int i = 0; i <= 100; ++i)
    {
        Check(i);
        memset(visit, false, sizeof(visit));
    }
 
    std::cout << iMax;
 
    return 0;
}
 

BFS로 처리