1일1알

백준 21938번 영상처리 C++ 본문

알고리즘

백준 21938번 영상처리 C++

영춘권의달인 2023. 5. 25. 13:07

https://www.acmicpc.net/problem/21938

 

21938번: 영상처리

화면의 세로 $N$, 가로 $M$ 값이 공백으로 구분되어 주어진다. 두 번째 줄부터 $N + 1$줄까지 $i$번째 가로를 구성하고 있는 픽셀의 $R_{i,j}$, $G_{i,j}$, $B_{i,j}$의 값이 공백으로 구분되어 총 $M$개 주어진

www.acmicpc.net

 

bfs로 풀수있는 간단한 문제인데, 입력 방식이 조금 특이했다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

int dRow[4] = { -1,0,1,0 };
int dCol[4] = { 0,1,0,-1 };

int n, m, t;
vector<vector<int>> r;
vector<vector<int>> g;
vector<vector<int>> b;
vector<vector<int>> avg;
vector<vector<bool>> found;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> m;
    r = vector<vector<int>>(n, vector<int>(m));
    g = vector<vector<int>>(n, vector<int>(m));
    b = vector<vector<int>>(n, vector<int>(m));
    avg = vector<vector<int>>(n, vector<int>(m));
    found = vector<vector<bool>>(n, vector<bool>(m, false));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m * 3; j++) {
            if (j % 3 == 0) cin >> r[i][j / 3];
            else if (j % 3 == 1) cin >> g[i][j / 3];
            else cin >> b[i][j / 3];
        }
    }
    cin >> t;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int sum = r[i][j] + g[i][j] + b[i][j];
            if (sum / 3 >= t) avg[i][j] = 255;
            else avg[i][j] = 0;
        }
    }
    int ans = 0;
    queue<pair<int, int>> q;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (avg[i][j] == 0) continue;
            if (found[i][j]) continue;
            q.push({ i,j });
            found[i][j] = true;
            ans++;
            while (!q.empty()) {
                auto curr = q.front();
                q.pop();
                for (int k = 0; k < 4; k++) {
                    int nextRow = curr.first + dRow[k];
                    int nextCol = curr.second + dCol[k];
                    if (nextRow < 0 || nextRow >= n) continue;
                    if (nextCol < 0 || nextCol >= m) continue;
                    if (avg[nextRow][nextCol] == 0) continue;
                    if (found[nextRow][nextCol]) continue;
                    found[nextRow][nextCol] = true;
                    q.push({ nextRow,nextCol });
                }
            }
        }
    }
    cout << ans;
}