Mô tả bài toán
Lưới h×w có ô chặn '#' và ô trống '.'. Chỉ đi ngang/dọc giữa các ô trống. Tìm khoảng cách lớn nhất (số bước) giữa 2 ô trống bất kỳ (đường đi ngắn nhất giữa chúng).
Ví dụ
h=4,w=4, grid={"..#.", "#.#.", "..##", "###."}. Đầu ra: 4 (từ (0,0) đến (2,0)).
Thuật toán (BFS từ mỗi ô trống)
- Với mỗi ô trống
(i,j), chạy BFS tính khoảng cách đến mọi ô trống khác. - Cập nhật
res = max(res, dist[x][y])trong BFS. - Độ phức tạp
O((hw)^2), chấp nhận được vớih,w ≤ 20.
Đoạn mã C++
#include <bits/stdc++.h>
using namespace std;
int solve(int h,int w,vector<string> grid){
int dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1};
vector<vector<int>> dist(h,vector<int>(w,-1));
vector<vector<int>> reset(h,vector<int>(w,-1));
int res=0;
for(int i=0;i=0&&nx=0&&ny
Đầu vào / Đầu ra
Input: 4, 4, {"..#.", "#.#.", "..##", "###."}
Output: 4