Mô tả bài toán
Cho ma trận 2D M biểu diễn mức xám ảnh. Làm mượt: mỗi pixel mới = trung bình (làm tròn xuống) của 8 hàng xóm và chính nó. Nếu ít hơn 8 hàng xóm (ở rìa), lấy trung bình các ô có sẵn.
Ví dụ: Ma trận 3×3 toàn 1 trừ giữa là 0 → Kết quả toàn 0.
Giải pháp (Duyệt 3×3)
- Với mỗi ô
(i,j), duyệtdx, dy ∈ {-1,0,1}. - Tính tổng và đếm ô hợp lệ (
0 ≤ m < R, 0 ≤ n < C). res[i][j] = sum / count.
Ví dụ minh họa
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<int>> v) {
cout << "[";
for (int i = 0; i < v.size(); i++) {
cout << "[";
for (int j = 0; j < v[i].size(); j++) cout << v[i][j] << ", ";
cout << "],";
}
cout << "]" << endl;
}
class Solution {
public:
vector<vector<int>> imageSmoother(vector<vector<int>>& M) {
int R = M.size(), C = M[0].size();
vector<int> d = {-1, 0, 1};
vector<vector<int>> res(R, vector<int>(C, 0));
for (int i = 0; i < R; ++i)
for (int j = 0; j < C; ++j) {
int sum = 0, count = 0;
for (int dx : d)
for (int dy : d) {
int m = i + dx, n = j + dy;
if (m >= 0 && m < R && n >= 0 && n < C) {
++count; sum += M[m][n];
}
}
res[i][j] = sum / count;
}
return res;
}
};
int main() {
Solution ob;
vector<vector<int>> v = {{1,1,1},{1,0,1},{1,1,1}};
print_vector(ob.imageSmoother(v));
return 0;
}
Đầu vào
{{1,1,1},{1,0,1},{1,1,1}}
Đầu ra
[[0, 0, 0, ],[0, 0, 0, ],[0, 0, 0, ],]