Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Ma trận 01 trong C++

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)

  1. Khởi tạo ma trận kết quả ret với giá trị lớn (INF).
  2. Đưa tất cả ô có giá trị 0 vào hàng đợi, đặt ret = 0 cho các ô này.
  3. 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.
  4. 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).