假设有一个尺寸为 h * w 的网格。在单元格位置 (0, 0) 中有一个机器人,它必须前往位置 (h - 1, w - 1)。网格中有两种类型的单元格,阻塞的和未阻塞的。机器人可以通过未阻塞的单元格,但不能通过阻塞的单元格。机器人可以四个方向走;它可以向左、向右、向上和向下移动。但是机器人可以从一个单元格到另一个单元格的任何方向(忽略它所在的前一个单元格),因此我们必须只制作一条路径并阻止不在该路径中的所有其他单元格。我们必须找出并返回我们必须阻止多少个单元才能为机器人创建一条从 (0, 0) 到 (h - 1, w - 1) 的路径,如果没有路径,我们返回 -1。
所以,如果输入像 h = 4, w = 4, grid = {"..#.", "#.#.", "#.##", "#..."},那么输出将是 2。
我们只需要阻止两个单元格来创建从 (0, 0) 到 (3, 3) 的单个路径。
为了解决这个问题,我们将遵循以下步骤 -
Define one 2D array dp dp[0, 0] := 0 Define an array moves containing pairs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}} Define one queue q insert pair (0, 0) at the end of q while (not q is empty), do: p := first element of q delete first element from q for initialize i := 0, when i < 4, update (increase i by 1), do: row := first value of p + first value of moves[i] col := second value of p + second value of moves[i] if row < 0 or row > h - 1 or col < 0 or col > w - 1, then: Ignore following part, skip to the next iteration if grid[row, col] is same as '#', then: Ignore following part, skip to the next iteration if dp[first value of p, second value of p] + 1 < dp[row, col], then: dp[row, col] := dp[first value of p, second value of p] + 1 insert pair(row, col) into q if dp[h - 1, w - 1] is same as 2500, then: return -1 count := 0 for initialize i := 0, when i < h, update (increase i by 1), do: for initialize j := 0, when j < w, update (increase j by 1), do: if grid[i, j] is same as '.', then: (increase count by 1) return count - (dp[h - 1, w - 1] + 1)
示例
让我们看看以下实现以更好地理解 -
#include <bits/stdc++.h> using namespace std; int solve(int h, int w, vector<string> grid){ vector<vector<int>> dp(h, vector<int>(w, 2500)); dp[0][0] = 0; vector<pair<int, int>> moves = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; queue<pair<int, int>> q; q.push(make_pair(0, 0)); while (!q.empty()) { auto p = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int row =p.first+ moves[i].first; int col =p.second+ moves[i].second; if (row < 0 || row > h - 1 || col < 0 || col > w - 1) continue; if (grid[row][col] == '#') continue; if (dp[p.first][p.second] + 1 < dp[row][col]) { dp[row][col] = dp[p.first][p.second] + 1; q.push(make_pair(row, col)); } } } if (dp[h - 1][w - 1] == 2500) { return -1; } int count = 0; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (grid[i][j] == '.') count++; } } return count - (dp[h - 1][w - 1] + 1); } int main() { int h = 4, w = 4; vector<string> grid = {"..#.", "#.#.", "#.##", "#..."}; cout<< solve(h, w, grid); return 0; }
输入
4, 4, {"..#.", "#.#.", "#.##", "#..."}输出结果
2