Mô tả bài toán
Cho lưới h×w có chướng ngại vật ('#') và ô trống ('.'). Một đèn pin đặt ở ô trống sẽ chiếu sáng 4 hướng (trên, dưới, trái, phải) cho đến khi gặp chướng ngại vật. Tìm vị trí đặt đèn để số ô được chiếu sáng (kể cả ô đặt đèn) lớn nhất.
Ví dụ
h=4,w=4, lưới = {"#...", "....", "...#", "...."}. Đầu ra: 7.
Thuật toán (Tiền xử lý 4 hướng)
- Mảng
first[i][j]: số ô trống liên tiếp bên trái (kể ô hiện tại) trước khi gặp '#'. - Quét trái→phải, sau đó phải→trái để
first[i][j]= max ô trống liên tiếp theo hàng. - Tương tự
second[i][j]cho cột (trên→dưới, dưới→trên). - Kết quả = maxi,j (
first[i][j] + second[i][j]) + 1.
Đoạn mã C++
#include <bits/stdc++.h>
using namespace std;
int solve(int h, int w, vector<string> grid) {
vector<vector<int>> first(h, vector<int>(w));
for(int i=0;i=0;j--) {
if(grid[i][j]=='#') { k=0; continue; }
k=max(k, first[i][j]);
first[i][j]=k;
}
}
vector<vector<int>> second(h, vector<int>(w));
for(int j=0;j=0;i--) {
if(grid[i][j]=='#') { k=0; continue; }
k=max(k, second[i][j]);
second[i][j]=k;
}
}
int res=0;
for(int i=0;i
Đầu vào / Đầu ra
Input: 4, 4, {"#...", "....", "...#", "...."}
Output: 7