티스토리 뷰

// 2020-05-20 wsshin

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

void Solution(int SizeY, int SizeX, int& AreaMax, int& FeatureCnt, vector<vector<int>> vecBoard);


int main()
{
    int Y = 0;
    int X = 0;

    cin >> Y >> X;

    vector<vector<int>> vecBoard;

    for (int i = 0; i < Y; i++)
    {
        vector<int> nTemp;
        for (int j = 0; j < X; j++)
        {
            int nInput = 0;
            cin >> nInput;
            nTemp.push_back(nInput);
        }
        vecBoard.push_back(nTemp);
    }

    int AreaMax = 0;
    int FeatureCnt = 0;

    Solution(Y, X, AreaMax, FeatureCnt, vecBoard);

    if (FeatureCnt == 0) AreaMax = 0;

    cout << FeatureCnt << endl;
    cout << AreaMax;
}

void Solution(int SizeY, int SizeX, int& AreaMax, int& FeatureCnt, vector<vector<int>> vecBoard)
{
    vector<vector<int>> vecOrder{ // 시계방향
        {-1,    0}, // 상
        { 0,    1}, // 우
        { 1,    0}, // 하
        { 0,    -1} // 좌
    };

    queue<pair<int, int>> queue;

    vector<vector<int>> vecVisited(SizeY, vector<int>(SizeX, 0));


    for (int Y = 0; Y < SizeY; Y++)
    {
        for (int X = 0; X < SizeX; X++)
        {
            if (vecBoard[Y][X] == 0) continue;
            if (vecVisited[Y][X] == 1) continue;

            int AreaCnt = 0;

            vecVisited[Y][X] = 1;
            // 첫번째 시작 노드 삽입
            queue.push(make_pair(Y, X));
            FeatureCnt++;


            while (!queue.empty())
            {
                int PopY = 0;
                int PopX = 0;

                PopY = queue.front().first;
                PopX = queue.front().second;
                queue.pop();
                AreaCnt++;

                for (int i = 0; i < vecOrder.size(); i++)
                {
                    int PushY = PopY + vecOrder[i][0];
                    int PushX = PopX + vecOrder[i][1];

                    if (PushY >= SizeY || PushY < 0) continue;
                    if (PushX >= SizeX || PushX < 0) continue;
                    if (vecVisited[PushY][PushX] == 1) continue;
                    if (vecBoard[PushY][PushX] == 0) continue;

                    vecVisited[PushY][PushX] = 1;
                    queue.push(make_pair(PushY, PushX));
                }
            }

            if (AreaMax < AreaCnt)
            {
                AreaMax = AreaCnt;
            }
        }
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함