관리 메뉴

민우의 코딩노트

1926번 그림 - C++ 본문

Algorithm/BOJ

1926번 그림 - C++

미미누 2022. 7. 27. 19:21

[문제]
https://www.acmicpc.net/problem/1926

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로

www.acmicpc.net


[풀이]
DFS 기본 문제
큐에 원소를 처음 넣을때마다 도형 개수를 1 증가 시키고, DFS 탐색하여 원소의 넓이를 구하면 되는 문제이다.

[코드]

#include <bits/stdc++.h>
using namespace std;

#define X first
#define Y second

int board[501][501];
bool vis[501][501];

int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

int main() {
    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 >> board[i][j];
        
    int cnt = 0, mx = 0;
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            
            if(!board[i][j] || vis[i][j]) continue;
            queue<pair<int,int>> Q;
            cnt++;
            Q.push({i,j});
            vis[i][j] =1;
            int size = 0;
            while(!Q.empty()){
                size++;
                pair<int,int> cur = Q.front(); Q.pop();
                for(int i=0; i<4; i++){
                    int x = cur.X + dx[i];
                    int y = cur.Y + dy[i];
                    
                    if(x < 0 || x >= n || y < 0 || y >= m) continue;
                    if(!board[x][y] || vis[x][y]) continue;
                    
                    vis[x][y] = 1;
                    Q.push({x,y});
                    
                }
            }
            mx = max(mx, size);
        }
    }
    cout << cnt << '\n' << mx;
    
}

'Algorithm > BOJ' 카테고리의 다른 글

4179번 불! - C++  (0) 2022.07.29
2504번 괄호의 값 - C++  (0) 2022.07.27
5430번 AC - C++  (0) 2022.07.26
1021번 회전하는 큐 - C++  (0) 2022.07.26
2164번 카드2 - C++  (0) 2022.07.25