题目与水位上升的泳池中游泳类似
二分查找+BFS
首先,采用二分查找,确定一个体力值,再从左上角,进行BFS,查看能否到达右下角,如果不行,二分查找就往大的数字进行查找,如果可以,还要继续往小的数字进行查找,比如示例1,数字10肯定可以到达右下角,但不是最小的体力。
class Solution {
public:
int dx[4] = {
0,0,-1,1 };
int dy[4] = {
-1,1,0,0 };
int m, n;
bool bfs(vector<vector<int>>& heights, vector<vector<int>> exist, int sub)//二分+BFS
{
exist[0][0] = 1;
queue<pair<int, int>> q;
q.emplace(0, 0);
while (!q.empty())
{
auto [i, j] = q.front();
q.pop();
for (int k = 0; k < 4; ++k)//上下左右四个方向
{
int newi = i + dx[k];
int newj = j + dy[k];
if (newi >= 0 && newi < m && newj >= 0 && newj < n && !exist[newi][newj] && sub >= abs(heights[i][j] - heights[newi][newj]))
{
exist[newi][newj] = 1;
if (newi == m - 1 && newj == n - 1)//到达右下角
{
return true;
}
q.emplace(newi, newj);