《本地AC,洛谷RE》
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
struct node{
int x,y;
}tmp;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int n,m,a[MAXN][MAXN],maxp;
queue<node>q;
bool vis[MAXN][MAXN];
bool bfs(int x)
{
q=queue<node>();
q.push((node){1,1});
int tx,ty;
memset(vis,false,sizeof(vis));
vis[1][1]=true;
while(!q.empty())
{
tmp=q.front();q.pop();
for(int i=0;i<4;i++){
tx=tmp.x+dx[i];ty=tmp.y+dy[i];
if(tx>0&&ty>0&&tx<=n&&ty<=m&&a[tx][ty]<=x&&!vis[tx][ty]){
vis[tx][ty]=true;
q.push((node){tx,ty});
if(tx==n)return true;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
maxp=max(maxp,a[i][j]);
}
int l=0,r=maxp,mid;
while(l<=r)
{
mid=l+r>>1;
if(bfs(mid))r=mid-1;
else l=mid+1;
}
cout<<r+1;
return 0;
}