悬赏一个关注,我裂开了,用二分输出一个很大的数
查看原帖
悬赏一个关注,我裂开了,用二分输出一个很大的数
1034242
RingTouSou楼主2023/10/25 00:22
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
typedef pair<int,int> PII;

PII p[N*N];

#define x first 
#define y second
#define endl "\n"

int high[N][N];
int flag[N][N];
int cnt_flag;
int x1,y_1;
int n,m;

bool st[N][N];

int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};



bool check(int d)
{
	p[0]={x1,y_1};
	int cnt=1;
	int hh=0;
	int tt=0;
	while(hh<=tt)
	{
		auto t = p[hh++];
		for(int i=0;i<4;i++)
		{
			int a=t.x+dx[i];
			int b=t.x+dy[i];
			
			if(a<1||a>n||b<1||b>m)
			{
				continue;
		    }
		    if(st[a][b]) continue;
		    if(abs(high[t.x][t.y]-high[a][b])>d) continue;
		    
		    p[++tt] = {a,b};
		    st[a][b]=true;
		    
		    if(flag[a][b]==1)
		    {
		    	cnt++;
			
			if(cnt==cnt_flag)
			{
				return true;
			}
		    }
			}
			}
			return false;
}


int main()
{
    cin>>n>>m;
    
    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=m;j++)
    	{
    		cin>>high[i][j];
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>flag[i][j];
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(flag[i][j]==1)
			{
				cnt_flag++;
			}
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(flag[i][j]==1)
			{
				x1=i;
				y_1=j;
				break;
			}
		}
	}
	
	int l=-1;
	int r=1e9+10;
	while(l+1<r)
	{
		int mid=(l+r)/2;
		memset(p,0,sizeof p);
		memset(st,false,sizeof st);
		if(check(mid))
		{
			r=mid;
		}
		else
		{
			l=mid;
		}
	}
	cout<<r<<endl;
	return 0;
}
2023/10/25 00:22
加载中...