Cho một ma trận nhị phân, chúng ta cần tìm khoảng cách tối thiểu từ mỗi ô đến ô gần nhất có chứa 1.
Hãy xem một ví dụ.
Đầu vào
0 0 1 1 1 0 0 0 0
Đầu ra
1 1 0 0 0 1 1 1 2
Khoảng cách tối thiểu là khoảng cách nhỏ nhất từ hàng ô hiện tại - 1 hàng ô + cột ô hiện tại - 1 cột ô.
Thuật toán
-
Khởi tạo ma trận có kích thước mong muốn.
-
Khởi tạo một ma trận khác có cùng kích thước để lưu trữ khoảng cách.
-
Lặp lại trên toàn bộ ma trận
.-
Nếu giá trị ô hiện tại là 1, thì hãy đặt khoảng cách thành 0 vì khoảng cách từ 1 đến 1 là 0
-
Nếu giá trị ô hiện tại là 0
-
Lặp lại toàn bộ ma trận một lần nữa
-
Nếu ô là 1, thì hãy tính khoảng cách từ ô hiện tại.
-
Cập nhật khoảng cách tối thiểu.
.
-
-
-
In ma trận khoảng cách.
Thực hiện
Sau đây là cách thực hiện thuật toán trên trong C ++
#include <bits/stdc++.h> using namespace std; vector<vector<int>> findNearest1Distance(vector<vector<int>>& matrix) { int rows = matrix.size(); if (rows == 0) { return matrix; } int cols = matrix[0].size(); vector<vector<int>> distance(rows, vector<int>(cols, INT_MAX)); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (matrix[i][j] == 1) { distance[i][j] = 0; }else if (matrix[i][j] == 0) { for (int k = 0; k < rows; k++) { for (int l = 0; l < cols; l++) { if (matrix[k][l] == 1) { distance[i][j] = min(distance[i][j], abs(k - i) + abs(l - j)); } } } } } } return distance; } int main() { vector<vector<int>> matrix{ {0, 0, 1}, {1, 1, 0}, {0, 0, 0} }; vector<vector<int>> result = findNearest1Distance(matrix); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { cout << result[i][j] << " "; } cout << endl; } return 0; }
Đầu ra
Nếu bạn chạy đoạn mã trên, thì bạn sẽ nhận được kết quả sau.
1 1 0 0 0 1 1 1 2