Giả sử chúng ta có một ma trận chứa H hàng và W cột. Các ô giữ '.' hoặc '#'. Dấu chấm '.' cho biết không gian có thể chuyển và '#' cho biết khối. Amal sẽ đi từ nhà của mình đến một khu chợ. Nhà của anh ta ở phòng giam ở góc trên bên trái, và chợ ở góc dưới cùng bên phải. Amal có thể di chuyển một ô lên, xuống, sang trái hoặc phải đến một ô có thể chuyển được. Anh ta không thể rời khỏi thị trấn. Anh ta cũng không thể vào một ô bị chặn. Tuy nhiên, sức mạnh thể chất của anh ta cho phép anh ta phá hủy tất cả các khối trong một khu vực hình vuông với các ô 2 × 2 do anh lựa chọn chỉ bằng một cú đấm, làm cho các ô này có thể vượt qua được. Chúng tôi phải tìm ra số lượng cú đấm tối thiểu cần thiết để Amal tiếp cận thị trường.
Vì vậy, nếu đầu vào giống như
. | . | # | . | . |
# | . | # | . | # |
# | # | . | # | # |
# | . | # | . | # |
. | . | # | . | . |
thì đầu ra sẽ là 1, vì chúng ta có thể làm cho lưới giống như -
. | . | # | . | . |
# | . | . | . | # |
# | # | . | . | # |
# | . | # | . | # |
. | . | # | . | . |
bằng cách phá hủy các hộp đã đánh dấu
Các bước
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
n := row count of matrix m := column count of matrix Define one 2D array dist of order (n + 1) x (m + 1) Define one deque dq insert ( 0, 0 ) at the beginning of dq dist[0, 0] := 0 while (not dq is empty), do: v := first element of dq delete front element from dq for initialize i := 0, when i < 4, update (increase i by 1), do: x := dx[i] + v[0] y := dy[i] + v[1] if x >= 0 and x < n and y >= 0 and y < m, then: if matrix[x, y] is same as '.', then: if dist[x, y] > dist[v[0], v[1]], then: dist[x, y] := dist[v[0], v[1]] insert pair { x, y } at the beginning of dq Otherwise for initialize p := x - 1, when p <= x + 1, update (increase p by 1), do: for initialize q := y - 1, when q <= y + 1, update (increase q by 1), do: if p >= 0 and p < n and q >= 0 and q < m, then: if dist[p, q] > dist[v[0], v[1]] + 1, then: dist[p, q] := dist[v[0], v[1]] + 1 insert pair { p, q } at the end of dq return dist[n - 1, m - 1]
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <bits/stdc++.h> using namespace std; int dx[4] = { 0, 0, -1, 1 }; int dy[4] = { -1, 1, 0, 0 }; int solve(vector<vector<char>> matrix){ int n = matrix.size(); int m = matrix[0].size(); vector<vector<int>> dist(n + 1, vector<int>(m + 1, 1e9)); deque<array<int, 2>> dq; dq.push_front({ 0, 0 }); dist[0][0] = 0; while (!dq.empty()){ auto v = dq.front(); dq.pop_front(); for (int i = 0; i < 4; i++){ int x = dx[i] + v[0], y = dy[i] + v[1]; if (x >= 0 && x < n && y >= 0 && y < m){ if (matrix[x][y] == '.'){ if (dist[x][y] > dist[v[0]][v[1]]){ dist[x][y] = dist[v[0]][v[1]]; dq.push_front({ x, y }); } } else{ for (int p = x - 1; p <= x + 1; p++){ for (int q = y - 1; q <= y + 1; q++){ if (p >= 0 && p < n && q >= 0 && q < m){ if (dist[p][q] > dist[v[0]][v[1]] + 1){ dist[p][q] = dist[v[0]][v[1]] + 1; dq.push_back({ p, q }); } } } } } } } } return dist[n - 1][m - 1]; } int main(){ vector<vector<char>> matrix = { { '.', '.', '#', '.', '.' }, { '#', '.', '#', '.', '#' }, { '#', '#', '.', '#', '#' }, { '#', '.', '#', '.', '#' }, { '.', '.', '#', '.', '.' } }; cout << solve(matrix) << endl; }
Đầu vào
{ { '.', '.', '#', '.', '.' }, { '#', '.', '#', '.', '#' }, { '#', '#', '.', '#', '#' }, { '#', '.', '#', '.', '#' }, { '.', '.', '#', '.', '.' } }
Đầu ra
1