大概题意:给你一个n*m的矩阵,第1行和第n行全为0,要你从第1行走迷宫走到第n行去,然后mi'j有对应的伤害,你只会受到路径上的最大伤害,问你能从第1行到第n行受到的最小伤害是多少;
思路:最小的最大值,考虑二分答案,路径考虑简单迷宫,bfs即可;
AC代码:
#include<bits/stdc++.h>
#define js ios::sync_with_stdio(false)
#define ll long long
using namespace std;
const ll N=2e6+5;
const ll INF=0x3f3f3f;
int mp[1005][1005],vis[1005][1005];
int x_[5]={-1,0,1,0};
int y_[5]={0,1,0,-1};
struct node{
int x,y;
};
int n,m;
bool check(int mid){
memset(vis,0,sizeof vis);
queue<node>q;
q.push((node){1,1});
vis[1][1]=1;
while(!q.empty()){//简单bfs迷宫
node f=q.front();
q.pop();
if(f.x==n-1){
return true;
}
for(int i=0;i<4;i++){
int dx=f.x+x_[i];
int dy=f.y+y_[i];
if(!vis[dx][dy]&&mp[dx][dy]<=mid&&dx<=n&&dy<=m&&dx>0&&dy>0){
q.push((node{dx,dy}));
if(dx==n-1){
return true;
}
vis[dx][dy]=1;
}
}
}
return false;
}
void solve(){
cin>>n>>m;
int l=1005,r=-1,mid,ans;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
r=max(r,mp[i][j]);
l=min(l,mp[i][j]);
}
}
while(l<=r){//二分模板
mid=(l+r)/2;
if(check(mid)){
r=mid-1;
ans=mid;
}
else{
l=mid+1;
}
}
cout<<ans<<endl;
}
int main(){
js;
solve();
return 0;
}