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

Kiểm tra đường đi trong ma trận 2D trong C++


Cho ma trận 2D chứa 0 và 1 (0: ô trống, 1: chặn). Kiểm tra có đường đi từ góc trên-trái đến góc dưới-phải hay không. Góc trên-trái luôn là 1.

Ví dụ ma trận 5x5:

00010
10011
00010
10000
00100

Có đường đi (đánh dấu xanh). Thuật toán: đổi các ô có thể đến thành -1. Bắt đầu từ (0,0) = -1. Duyệt hàng đầu và cột đầu, lan truyền giá trị -1 nếu ô không phải 1. Với các ô còn lại, lấy min của ô trên và ô trái. Cuối cùng kiểm tra ô (n-1,m-1) có phải -1 không.

Ví dụ

#include <iostream>
#define row 5
#define col 5
using namespace std;

bool isPathPresent(int arr[row][col]) {
    arr[0][0] = -1;
    for (int i = 1; i < row; i++)
        if (arr[i][0] != 1)
            arr[i][0] = arr[i - 1][0];
    for (int j = 1; j < col; j++)
        if (arr[0][j] != 1)
            arr[0][j] = arr[0][j - 1];
    for (int i = 1; i < row; i++)
        for (int j = 1; j < col; j++)
            if (arr[i][j] != 1)
                arr[i][j] = min(arr[i][j - 1], arr[i - 1][j]);
    return (arr[row - 1][col - 1] == -1);
}

int main() {
    int arr[row][col] = {{ 0, 0, 0, 1, 0},
        {1, 0, 0, 1, 1},
        { 0, 0, 0, 1, 0},
        {1, 0, 0, 0, 0},
        { 0, 0, 1, 0, 0}};
    if (isPathPresent(arr))
        cout << "Path is present";
    else
        cout << "No path has found";
}

Kết quả

Path is present