add: 221030

This commit is contained in:
Eatswap 2022-10-30 18:40:30 +08:00
parent b2c871ce9a
commit 0b7cdf0450
Signed by: Eatswap
GPG Key ID: BE661106A1F3FA0B
2 changed files with 55 additions and 1 deletions

54
cpp/2210/221030.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <vector>
#include <queue>
#include <tuple>
#include <iostream>
/**
* 1293. Shortest Path in a Grid with Obstacles Elimination
*
* You are given an m x n integer matrix grid where each cell is either 0 (empty) or 1 (obstacle). You can move up, down, left, or right from and to an empty cell in one step.
* Return the minimum number of steps to walk from the upper left corner (0, 0) to the lower right corner (m - 1, n - 1) given that you can eliminate at most k obstacles. If it is not possible to find such walk return -1.
*/
class Solution {
private:
static constexpr inline bool OK(int x, int y, int m, int n) {
return x >= 0 && y >= 0 && x < m && y < n;
}
static const inline int dX[] = {0, 1, 0, -1};
static const inline int dY[] = {1, 0, -1, 0};
public:
static int shortestPath(const std::vector<std::vector<int>>& G, const int k) {
const int m = G.size(), n = G.front().size(), p = m * n;
if (m == 1 && n == 1)
return 0;
auto dp = new int[40][40][1600]{};
std::queue<std::tuple<uint8_t, uint8_t, short, int>> q;
q.push({m - 1, n - 1, 0, 0});
dp[m - 1][n - 1][0] = -1;
while (!q.empty()) {
const auto [x, y, d, l] = q.front();
q.pop();
for (int i = 0; i < 4; ++i) {
int nx = x + dX[i], ny = y + dY[i];
if (!OK(nx, ny, m, n) || dp[nx][ny][d + G[nx][ny]] || d + G[nx][ny] > k)
continue;
q.push({nx, ny, d + G[nx][ny], dp[nx][ny][d + G[nx][ny]] = 1 + l});
}
}
int ans = 0x7FFFFFFF;
for (int i = 0; i <= k; ++i)
if (dp[0][0][i])
ans = std::min(ans, dp[0][0][i]);
delete[] dp;
return ans == 0x7FFFFFFF ? -1 : ans;
}
};
int main() {
std::cout << Solution::shortestPath({{0,0,0},{1,1,0},{0,0,0},{0,1,1},{0,0,0}}, 1);
return 0;
}

View File

@ -3,4 +3,4 @@ PROJECT(2210)
SET(CMAKE_CXX_STANDARD 23)
ADD_EXECUTABLE(2210 221029-CN.cpp)
ADD_EXECUTABLE(2210 221030.cpp)