Giới thiệu
Cho ma trận chỉ chứa 0 và 1. Tìm khoảng cách từ mỗi ô đến ô 0 gần nhất. Khoảng cách giữa 2 ô liền kề (trên, dưới, trái, phải) là 1.
Thuật toán BFS đa nguồn (Multi-source BFS)
- Khởi tạo ma trận kết quả
retvới giá trị lớn (INF). - Đưa tất cả ô có giá trị 0 vào hàng đợi, đặt
ret = 0cho các ô này. - BFS theo cấp độ: từ các ô trong hàng đợi, lan ra 4 hướng. Nếu ô lân cận chưa được cập nhật (giá trị INF), gán cấp độ hiện tại và đưa vào hàng đợi.
- Kết thúc khi hàng đợi rỗng.
Cài đặt C++
#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{1,0}, {-1,0}, {0,-1}, {0,1}};
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
vector<vector<int>> ret(n, vector<int>(m, INT_MAX));
queue<pair<int,int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == 0) {
ret[i][j] = 0;
q.push({i, j});
}
}
}
for (int lvl = 1; !q.empty(); lvl++) {
int sz = q.size();
while (sz--) {
auto [x, y] = q.front(); q.pop();
for (auto& d : dir) {
int nx = x + d[0], ny = y + d[1];
if (nx < 0 || nx >= n || ny < 0 || ny >= m || ret[nx][ny] != INT_MAX) continue;
ret[nx][ny] = lvl;
q.push({nx, ny});
}
}
}
return ret;
}
};
int main() {
Solution ob;
vector<vector<int>> v = {{0,0,0},{0,1,0},{1,1,1}};
auto res = ob.updateMatrix(v);
// In kết quả
for (auto& row : res) {
for (int val : row) cout << val << ' ';
cout << '\n';
}
return 0;
}
Kết quả mẫu
Input: {{0,0,0},{0,1,0},{1,1,1}}
Output:
0 0 0 0 1 0 1 2 1
Phân tích
- Thời gian: O(n*m) – mỗi ô được xử lý tối đa 1 lần.
- Không gian: O(n*m) cho ma trận kết quả và hàng đợi.
Đây là giải pháp chuẩn cho bài toán "01 Matrix" (LeetCode 542).