กำหนดกริด h × w มีหลอดไฟหลายดวง (ในอาร์เรย์ bulb) และอุปสรรค (ในอาร์เรย์ obstacle) หลอดส่องสว่างตัวเองและ 4 ทิศทาง จนกว่าจะเจออุปสรรค อุปสรรคบังแสงและไม่ถูกส่อง ต้องการหาจำนวนเซลล์ทั้งหมดที่ถูกส่องสว่าง
ตัวอย่าง: h=4, w=4, bulb={{1,1},{2,2},{3,3}}, obstacle={{0,0},{2,3}} ผลลัพธ์: 13
ขั้นตอนการแก้ปัญหา (Sweep 4 ทิศทาง)
- สร้างกริด
gridค่า 0=ว่าง, 1=หลอด, 2=อุปสรรค - อาร์เรย์
checkบูลีน เก็บว่าเซลล์ถูกส่องหรือไม่ - สแกนแถวซ้าย→ขวา: ตัวแปร
gdบอกว่ากำลังถูกส่องจากซ้ายหรือไม่ (เจอหลอด=1, เจออุปสรรค=0) OR เข้าcheck - สแกนแถวขวา→ซ้าย: เหมือนกัน
- สแกนคอลัมน์บน→ล่าง: ตัวแปร
kOR เข้าcheck - สแกนคอลัมน์ล่าง→บน: เหมือนกัน
- นับเซลล์ที่
check == falseลบออกจากh*wได้คำตอบ
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
int solve(int h, int w,
vector<pair<int, int>> bulb,
vector<pair<int, int>> obstacle) {
int bulbSize = bulb.size();
int blockSize = obstacle.size();
vector<vector<int>> grid(h, vector<int>(w, 0));
for (int i = 0; i < bulbSize; i++)
grid[bulb[i].first][bulb[i].second] = 1;
for (int i = 0; i < blockSize; i++)
grid[obstacle[i].first][obstacle[i].second] = 2;
int result = h * w;
vector<vector<bool>> check(h, vector<bool>(w, 0));
for (int i = 0; i < h; i++) {
bool gd = 0;
for (int j = 0; j < w; j++) {
if (grid[i][j] == 2) gd = 0;
if (grid[i][j] == 1) gd = 1;
check[i][j] = check[i][j] | gd;
}
gd = 0;
for (int j = w-1; j >= 0; j--) {
if (grid[i][j] == 2) gd = 0;
if (grid[i][j] == 1) gd = 1;
check[i][j] = check[i][j] | gd;
}
}
for (int j = 0; j < w; j++) {
bool k = 0;
for (int i = 0; i < h; i++) {
if (grid[i][j] == 2) k = 0;
if (grid[i][j] == 1) k = 1;
check[i][j] = check[i][j] | k;
}
k = 0;
for (int i = h-1; i >= 0; i--) {
if (grid[i][j] == 2) k = 0;
if (grid[i][j] == 1) k = 1;
check[i][j] = check[i][j] | k;
}
}
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
result -= !check[i][j];
return result;
}
int main() {
int h = 4, w = 4;
vector<pair<int, int>> bulb = {{1, 1}, {2, 2}, {3, 3}};
vector<pair<int, int>> obstacle = {{0, 0}, {2, 3}};
cout << solve(h, w, bulb, obstacle);
return 0;
}
อินพุต / เอาต์พุต
Input: 4, 4, {{1, 1}, {2, 2}, {3, 3}}, {{0, 0}, {2, 3}}
Output: 13