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