สมมติว่าเราได้รับตารางขนาด h x w มีเซลล์สองประเภทในตาราง เซลล์สีขาวและเซลล์สีดำ เซลล์สีขาวแสดงด้วย '.' ในขณะที่เซลล์สีดำแสดงด้วย '#' ตอนนี้กริดมีเซลล์สีดำหลายเซลล์ที่สร้างรูปหลายเหลี่ยม เราต้องหาจำนวนด้านที่รูปหลายเหลี่ยมมี โปรดทราบว่าเซลล์นอกสุดของตารางจะเป็นสีขาวเสมอ
ดังนั้น หากอินพุตเป็น h =4, w =4, grid ={"....", ".##.", ".##.", "...."} ก็จะได้ผลลัพธ์ จะเท่ากับ 4.
เซลล์สีดำเป็นรูปสี่เหลี่ยมจัตุรัส และสี่เหลี่ยมจัตุรัสมี 4 ด้าน
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
sides := 0 for initialize i := 1, when i < h, update (increase i by 1), do: for initialize j := 1, when j < w, update (increase j by 1), do: bl := 0 if grid[i - 1, j - 1] is same as '#', then: (increase bl by 1) if grid[i - 1, j] is same as '#', then: (increase bl by 1) if grid[i, j - 1] is same as '#', then: (increase bl by 1) if grid[i, j] is same as '#', then: (increase bl by 1) if bl is same as 1 or 3, then: (increase sides by 1) return sides
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; void solve(int h, int w, vector<string> grid){ int sides = 0; for(int i = 1; i < h; i++) { for(int j = 1; j < w; j++) { int bl = 0; if(grid.at(i - 1).at(j - 1) == '#') { bl++; } if(grid.at(i - 1).at(j) == '#') { bl++; } if(grid.at(i).at(j - 1) == '#') { bl++; } if(grid.at(i).at(j) == '#') { bl++; } if(bl == 1 or bl == 3) { sides++; } } } cout << sides; } int main() { int h = 4, w = 4; vector<string> grid = {"....", ".##.", ".##.", "...."}; solve(h, w, grid); return 0; }
อินพุต
4, 4, {"....", ".##.", ".##.", "...."}
ผลลัพธ์
4