思路:
最大值的最小值,考虑二分答案
二分上限,bfs判断可达性
c o d e code code
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n, m;
int a[1010][1010], b[1010][1010];
int dx[4]={0, 1, 0, -1};
int dy[4]={1, 0, -1, 0};
bool check(int maxx)
{
queue<pair<int, int> > q;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(a[i][j]>maxx)
b[i][j]=-1;
else b[i][j]=0;
for(int j=1; j<=m; j++)
if(b[1][j]==0)
q.push(make_pair(1, j)), b[1][j]=-1;
while(!q.empty())
{
int x=q.front().first, y=q.front().second;
q.pop();
for(int i=0; i<4; i++)
{
int xx=x+dx[i], yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>n||b[xx][yy]==-1)
continue;
q.push(make_pair(xx, yy));
b[xx][yy]=-1;
if(xx==n)
return 1;
}
}
return 0;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &a[i][j]);
int l=0, r=1000, ans=1e9;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid))
r=mid-1, ans=min(ans, mid);
else l=mid+1;
}
printf("%d", ans);
return 0;
}