板子题,没啥好说的;
二分伤害,bfs跑这个伤害是否能跑到第n行,跑的到的话减小伤害r=mid-1,跑不到的话扩大伤害l=mid+1。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
typedef pair<int,int> P;
int n,m;
int a[maxn][maxn];
bool flag[maxn][maxn];
int dis[4][2]={1,0,0,1,-1,0,0,-1};
bool BFS(int mid)
{
memset(flag,false,sizeof(flag));
queue<P> q;
q.push(P(1,1));
while(q.size())
{
P p=q.front();q.pop();
int x=p.first,y=p.second;
if(x==n) return true;
if(flag[x][y]) continue;
flag[x][y]=true;
for(int i=0;i<4;i++)
{
int px=x+dis[i][0],py=y+dis[i][1];
if(px>=1&&px<=n&&py>=1&&py<=m&&flag[px][py]==false&&a[px][py]<=mid)
{
q.push(P(px,py));
}
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
int l=0,r=maxn,ans;
while(l<=r)
{
int mid=l+r>>1;
if(BFS(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
return 0;
}