1 minute read

코드

#include <bits/stdc++.h>
#define ll long long
using namespace std;
#define X first
#define Y second

int p[501][501];
bool vis[501][501];
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };

int main(void) 
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, m; cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cin >> p[i][j];
    }
    queue<pair<int, int>> q;
    int mx = 0;
    int paper = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            int tmp = 0;
            if (p[i][j] && vis[i][j] != 1)
            {
                vis[i][j] = 1;
                q.push({ i,j });
                paper++;
                tmp = 1;
            }
            else
                continue;
            while (!q.empty())
            {
                pair<int, int> cur = q.front(); q.pop();
                for (int dir = 0; dir < 4; dir++)
                {
                    int nx = cur.X + dx[dir];
                    int ny = cur.Y + dy[dir];
                    if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
                    if (vis[nx][ny] || p[nx][ny] != 1) continue;
                    vis[nx][ny] = 1;    
                    q.push({nx,ny});
                    tmp++;
                }
            }
            mx = max(mx, tmp);
        }
    }
    cout << paper << "\n" << mx;

}

bfs기본 문제입니다. 전역 탐색하면서 1인곳에서 이미 방문한곳이 아니면 카운트 하고 탐색과정에서 tmp로 카운트하여 max함수로 비교하면 쉽게 최대크기를 알 수 있습니다.

Leave a comment