求助为什么测试点七过不去,一直90分
查看原帖
求助为什么测试点七过不去,一直90分
986285
muziovo楼主2023/5/16 19:30
#include<bits/stdc++.h>
using namespace std;
const int N= 505;

int n,m,sx=0,sy=0;
int high[N][N];
int flag[N][N];
bool st[N][N];
int flag_cnt = 0;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};

typedef pair<int,int> PII;
PII q[N*N];

bool check(int mid){
    q[0] = {sx,sy};
    st[sx][sy] = true;
    
    int hh =0,tt=0,cnt = 1;
   
    while(hh<=tt){
        
        auto t = q[hh++];
        
        for(int i =0;i<4;i++){
            
            int a = t.first +dx[i],b = t.second+dy[i];
            
            if(a<1||b<1||a>n||b>m) continue;
            if(st[a][b]) continue;
            if(abs(high[a][b] - high[t.first][t.second]) > mid) continue;
            
            st[a][b] = true;
            q[++tt] = {a,b};
            
            if(flag[a][b] == 1){
                cnt++;
                if(cnt==flag_cnt)
                    return true;
            }
        }
    }
    return false;
}

int main(){
    scanf("%d %d",&n,&m);
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j ++){
            scanf("%d",&high[i][j]);
        }
    }
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            scanf("%d",&flag[i][j]);
            if(flag[i][j] == 1){
                flag_cnt ++;
            }
        }
    }
    for(int i = 1;i <=n;i++){
        for(int j=1;j<=m;j++){
            if(flag[i][j] == 1){
                sx = i;
                sy = j;
            }
            break;
        }
    }
    int l =-1,r=1e9+1;
    while(l+1 <r ){
        int mid = (l+r)/2;
        memset(st,false,sizeof(st));
        memset(q,0,sizeof(q));
        if(check(mid))
            r = mid;
        else
            l = mid;
    }
    printf("%d\n",r);
    return 0;
}
2023/5/16 19:30
加载中...