ปัญหา
สมมติว่าเรามีเมทริกซ์ 2D M ที่แทนระดับสีเทาของภาพ เราต้องออกแบบตัวทำให้เรียบเพื่อให้ระดับสีเทาของแต่ละพิกเซลกลายเป็นค่าเฉลี่ยระดับสีเทา (ปัดลง) ของพิกเซลรอบข้าง 8 ตัวและตัวมันเอง หากเซลล์มีเซลล์รอบข้างน้อยกว่า 8 ตัว ให้แปลงพิกเซลที่เป็นไปได้ทั้งหมด
เช่น ถ้าผนวกเข้าเป็น
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |
วิธีแก้ปัญหา
- R := จำนวนแถวของ M
- C := จำนวนคอลัมน์ของ M
- กำหนดอาร์เรย์ d = { -1, 0, 1 }
- กำหนดอาร์เรย์ 2D res ขนาด (R x C)
- for i := 0 ถึง R-1 ทำ:
- for j := 0 ถึง C-1 ทำ:
- sum := 0, count := 0
- for k := 0 ถึง 2 ทำ:
- for l := 0 ถึง 2 ทำ:
- m := i + d[k], n := j + d[l]
- ถ้า m >= 0 และ m < R และ n >= 0 และ n < C:
- เพิ่ม count ขึ้น 1 และ sum = sum + M[m][n]
- for l := 0 ถึง 2 ทำ:
- res[i][j] := sum / count
- for j := 0 ถึง C-1 ทำ:
- คืนค่า res
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
cout << "[";
for(int i = 0; i= 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));
}
อินพุต
{{1,1,1},{1,0,1},{1,1,1}}
เอาต์พุต
[[0, 0, 0, ],[0, 0, 0, ],[0, 0, 0, ],]