思路:BFS+二分
这道题和洛谷上的那个“汽车拉力赛”那道题很相似,但是这道题相较于洛谷那个来说会简单一些。
这里作者一开始写的时候思路堵在了怎么在BFS中用二分,先入为主的以为需要先写出来搜索函数然后再去处理二分的事,但是这里是先二分找数,然后再搜索才是对的。所以先入为主之后就没有做出来。
注意:需要注意数据范围,另外,每一次更新mid数值的时候,我们上一次已经搜索过的数组,队列等存储单元都需要清空,不然的话会影响后面的输出结果。还有,二分注意用哪一个模板,选择也是很重要的。这里主要是求最小值,所以是(left+right)/2而不是(left+right+1)/2,还有就是while中不要left<=right,你用范围的二分查找会造成死循环,但是用于基本的找数是可以的。
class Solution {
public:
int minimumEffortPath(vector<vector<int>>& heights) {
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int left=0;
int right=1000000;
while(left<right){
queue<pair<int,int>>q;
q.push({0,0});
vector<vector<bool>>st(heights.size(),vector<bool>(heights[0].size(),false));
st[0][0]=true;
int mid=(left+right)/2;
while(!q.empty()){
auto tmp=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=dx[i]+tmp.first;
int b=dy[i]+tmp.second;
if(a>=heights.size()||a<0||b<0||b>=heights[0].size())continue;
if(st[a][b])continue;
if(abs(heights[a][b]-heights[tmp.first][tmp.second])>mid)continue;
q.push({a,b});
st[a][b]=true;
}
}
if(st[heights.size()-1][heights[0].size()-1])
{
right=mid;
}
else
{
left=mid+1;
}
}
return right;
}
};