Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Lonely Pixel I (Điểm đen đơn độc) trong C++


Cho ảnh biểu diễn bằng ma trận 2D ký tự 'B' (đen) và 'W' (trắng). Đếm số pixel đen 'B' là "đơn độc" (lonely): hàng và cột của pixel đó không có pixel đen nào khác.

Ví dụ

Ma trận 3x3:

W W B
W B W
B W W
Đầu ra: 3 (tất cả 3 pixel 'B' đều đơn độc).

Giải thuật

Duyệt ma trận, dùng hàng 0 và cột 0 làm bộ đếm tần suất (in-place).
Lần 1: gặp 'B' tại (i,j) → tăng picture[0][j] và picture[i][0] (dùng ký tự để đếm).
Lần 2: gặp 'B' tại (i,j) → nếu picture[0][j] và picture[i][0] đều chỉ đếm được 1 (giá trị 'C' hoặc 'X') → pixel đơn độc.

Ví dụ triển khai

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

class Solution {
public:
    int findLonelyPixel(vector<vector<char>>& picture) {
        int n = picture.size();
        int m = n ? picture[0].size() : 0;
        int ret = 0, firstRow = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (picture[i][j] == 'B') {
                    if (picture[0][j] < 'Y' && picture[0][j] != 'V') picture[0][j]++;
                    if (i == 0) firstRow++;
                    else if (picture[i][0] < 'Y' && picture[i][0] != 'V') picture[i][0]++;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (picture[i][j] < 'W' && (picture[0][j] == 'C' || picture[0][j] == 'X')) {
                    if (i == 0) ret += (firstRow == 1 ? 1 : 0);
                    else if (picture[i][0] == 'C' || picture[i][0] == 'X') ret++;
                }
            }
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector<vector<char>> v = {{'W','W','B'},{'W','B','W'},{'B','W','W'}};
    cout << ob.findLonelyPixel(v);
    return 0;
}

Đầu vào

{{'W','W','B'},{'W','B','W'},{'B','W','W'}}

Đầu ra

3