坐标离散化

本文介绍了一种用于二维空间中矩形区域填充的算法。通过坐标压缩技术减少内存使用,并利用广度优先搜索策略来标记未被矩形覆盖的独立区域。最终输出独立区域的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
int w,h,n;
const int maxn = 500;
int x1[maxn],x2[maxn],y1[maxn],y2[maxn];
bool fld[maxn*6][maxn*6];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0}; 
int compress(int *x1,int *x2,int w)
{
    vector<int>xs;
    for(int i=0;i<n;i++)
    {
        for(int d=-1;d<=1;d++)
        {
            int tx1=x1[i]+d,tx2=x2[i]+d;
            if(1<=tx1 && tx1<=w) xs.push_back(tx1);
            if(1<=tx2 && tx2<=w) xs.push_back(tx2);    
        }    
    }
    sort(xs.begin(),xs.end());
    xs.erase(unique(xs.begin(),xs.end()),xs.end());
    for(int i=0;i<n;i++)
    {
        x1[i]=find(xs.begin(),xs.end(),x1[i])-xs.begin();
        x2[i]=find(xs.begin(),xs.end(),x2[i])-xs.begin();    
    } 
    return xs.size();
}
void solve()
{
    w = compress(x1,x2,w);
    h = compress(y1,y2,h);
    memset(fld,0,sizeof(fld));
    for(int i=0;i<n;i++)
    {
        for(int y = y1[i];y<=y2[i];y++)
        {
            for(int x=x1[i];x<=x2[i];x++)
            {
                fld[y][x]=true;
            }
        }
    }
    int ans=0;
    for(int y=0;y<h;y++)
    {
        for(int x=0;x<w;x++)
        {
            if(fld[y][x]) continue;
            ans++;
            
            queue<pair<int,int> >que;
            que.push(make_pair(x,y));
            while(!que.empty())
            {
                int sx = que.front().first;
                int sy = que.front().second;
                que.pop();
                
                for(int i=0;i<4;i++)
                {
                    int tx=sx+dx[i],ty=sy+dy[i];
                    if(tx<0 || w<=tx || ty<0 || h<=ty) continue;
                    if(fld[ty][tx]) continue;
                    que.push(make_pair(tx,ty));
                    fld[ty][tx]=true;    
                }    
            } 
        }
    }
    cout  << ans;
}
int main(void)
{
    cin >> w >> h >> n;
    for(int i=0;i<n;i++) cin >> x1[i];
    for(int i=0;i<n;i++) cin >> x2[i];
    for(int i=0;i<n;i++) cin >> y1[i];
    for(int i=0;i<n;i++) cin >> y2[i];
    solve(); 
    return 0;
}

 

 

转载于:https://www.cnblogs.com/zuimeiyujianni/p/10034366.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值