马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
// 考察dfs跟二分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005;
int n,m,p[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0-1};
bool vis[N][N];
bool dfs(int x,int y,int P)
{
if(x==n)return true;
vis[x][y]=true;
for(int i=0;i<4;i++)
{
int a=x+dx[i],b=y+dy[i];
if(a>=1&&a<=n&&b>=1&&b<=m&&!vis[a][b]&&p[a][b]<=P)
{
if(dfs(a,b,P))return true;
}
//p大,易true
}
return false;
}
int find()
{
int l=-1,r=1001;
while(l+1<r)
{
int mid=l+r>>1;
memset(vis,0,sizeof(vis)); // 每次二分都要清空
if(dfs(1,1,mid)) r=mid;
else l=mid;
}
return r;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>p[i][j];
}
}
cout<<find()<<endl;
}
为什么二分出来的值还是右端点
样例:
4 2
0 0
3 5
2 4
0 0
|