神奇wa一个点求助
查看原帖
神奇wa一个点求助
1115431
fqy_small楼主2024/3/12 17:23
#include<bits/stdc++.h>
using namespace std;
#define MAX 55
#define ll long long
ll n,X,Y,k,K,ans=INT_MAX;
char c[MAX][MAX];
ll a[MAX][MAX],l=INT_MAX,r;
bool f[MAX][MAX];
void dfs(int x,int y,int h,int z){
    f[x][y]=1;
    if(c[x][y]=='K')k++;
    //printf("x:%d,y:%d,k:%d,K:%d\n",x,y,k,K);
    for(int i=-1;i<=1;i++){
        for(int j=-1;j<=1;j++){
            if(x+i<=n and x+i>=1 and y+j<=n and y+j>=1 and !f[x+i][y+j] and a[x+i][y+j]>=h and a[x+i][y+j]<=z){
                dfs(x+i,y+j,h,z);
            }
        }
    }
}
bool check(int mid,int z){
    memset(f,0,sizeof(f));
    k=0;
    dfs(X,Y,mid,z);
    if(k==K)return 1;
    return 0;
}
int main(){
    #ifdef DOWN
        freopen("in","r",stdin);
        freopen("out","w",stdout);
    #else
        ios::sync_with_stdio(0);
    #endif
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            cin>>c[i][j];
            if(c[i][j]=='P'){
                X=i;Y=j;
            }else if(c[i][j]=='K'){
                K++;
            }
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(a[i][j]<a[X][Y])continue;
            //printf("%d %d\n",a[X][Y],a[i][j]);
            l=1;
            r=a[i][j];
            while(l<=r){
                ll mid=(l+r+1)>>1;
                bool flag=check(mid,a[i][j]);
                if(flag){
                    ans=min(ans,a[i][j]-mid);
                    l=mid+1;
                }else{
                    r=mid-1;
                }
                //printf("yes/no:%d,l:%d,r:%d,mid:%d\n",(int)flag,l,r,mid);
            }
        }
    cout<<ans<<endl;
    return 0;
}
 

wa记录

2024/3/12 17:23
加载中...