Mô tả bài toán
Cho lưới h×w, vị trí các đèn pin (mảng bulb) và chướng ngại vật (mảng obstacle). Đèn pin chiếu sáng 4 hướng cho đến khi gặp chướng ngại vật. Tính tổng số ô được chiếu sáng (kể cả ô có đèn).
Ví dụ
h=4,w=4, bulb={{1,1},{2,2},{3,3}}, obstacle={{0,0},{2,3}}. Đầu ra: 13.
Thuật toán (Quét 4 hướng đánh dấu)
- Tạo mảng
grid: 0=trống, 1=đèn, 2=chướng ngại. - Mảng
checkbool đánh dấu ô được chiếu sáng. - Quét từng hàng trái→phải, phải→trái: biến
gd= 1 nếu gặp đèn, 0 nếu gặp chướng ngại.check[i][j] |= gd. - Quét từng cột trên→dưới, dưới→trên tương tự với biến
k. - Kết quả =
h*w - số ô có check=false.
Đoạn mã C++
#include <bits/stdc++.h>
using namespace std;
int solve(int h, int w,
vector<pair<int,int>> bulb,
vector<pair<int,int>> obstacle) {
vector<vector<int>> grid(h, vector<int>(w,0));
for(auto [x,y]: bulb) grid[x][y]=1;
for(auto [x,y]: obstacle) grid[x][y]=2;
int result = h*w;
vector<vector<bool>> check(h, vector<bool>(w,false));
for(int i=0;i=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=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
Đầu vào / Đầu ra
Input: 4, 4, {{1,1},{2,2},{3,3}}, {{0,0},{2,3}}
Output: 13