做出hard题来了,还挺快的QAQ,纪念一下~
解题思路
二分加dfs(丝毫没有剪枝还挺快的)
不过后来考虑了一点点剪枝,就是找到路了赶紧给我回去!
if(flag==1) return;
快了四毫秒~~~~~
有一个注意点:起始点需要判断一下大小
测试样例:
3 2
1 0
代码
class Solution {
public:
int n;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int visited[53][53];
int flag=0;
void dfs(int x,int y,vector<vector<int>>& grid,int m){
if(flag==1) return;
visited[x][y]=1;
if(x==n-1 && y==n-1){
flag=1;
return ;
}
for(int i=0;i<4;i++){
int now_x=x+dx[i];
int now_y=y+dy[i];
if(now_x>=0&&now_x<n&&now_y>=0&&now_y<n&&grid[now_x][now_y]<=m&&!visited[now_x][now_y]){
dfs(now_x,now_y,grid,m);
}
}
}
bool okk(int m,vector<vector<int>>& grid){
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
visited[i][j]=0;
}
}
flag=0;
if(grid[0][0]>m) return false;
dfs(0,0,grid,m);
return flag;
}
int swimInWater(vector<vector<int>>& grid) {
if(grid.empty()) return 0;
else{
n=grid.size();
int right=n*n-1;
int left=0;
while(left<right){
int mid=(left+right)/2;
if(okk(mid,grid)){
right=mid;
}
else{
left=mid+1;
}
}
return left;
}
}
};