求多个矩形覆盖区域面积(多组测试数据)

问题描述

在坐标平面上有 N 个矩形纸张。

每个纸张所覆盖的矩形区域的边与 x 或 y 轴平行。
具体来说,第 i 个纸张覆盖了满足Ai​≤x≤Bi​ 和 Ci​≤y≤Di​ 的区域。

设 S 为一个或多个纸张所覆盖的区域的面积。在约束条件下,可以证明 S 是一个整数。
将 S 打印为整数。

约束条件

  • 2≤N≤100
  • 0≤Ai​<Bi​≤100
  • 0≤Ci​<Di​≤100
  • 所有输入值都是整数。

输入

输入以以下格式从标准输入给出:

N
A1​ B1​ C1​ D1​
A2​ B2​ C2​ D2​
⋮⋮
AN​ BN​ CN​ DN​

输出

将一个或多个纸张所覆盖的区域的面积 S 打印为整数。

示例-1

输入

3
0 5 1 3
1 4 0 5
2 5 2 4

输出

20 

 这三个纸张覆盖了以下区域。
这里,红色、黄色和蓝色分别表示第一个、第二个和第三个纸张所覆盖的区域。

 

因此,一个或多个纸张所覆盖的区域的面积是S=20。

示例-2

输入

3
0 1 0 1
0 3 0 5
5 10 0 10

输出

65

C程序源代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=200+5;
struct Node//矩形
{
    double x1,y1,x2,y2;
}nodes[maxn];
double x[maxn],y[maxn];
bool mp[maxn][maxn];
 
int find(double *x,double val,int n)//在数组x中找到val值的位置
{
    int L=0,R=n-1;
    while(R>=L)
    {
        int mid=L+(R-L)/2;
        if(x[mid]==val) return mid;
        else if(x[mid]>val) R=mid-1;
        else L=mid+1;
    }
    return -1;
}
 
int main()
{
    int n,num1,num2,kase=0;
    while(scanf("%d",&n)==1 && n)
    {
        num1=num2=0;//num1记录有多少个不同x值,num2记录y的
        memset(mp,0,sizeof(mp));
        for(int i=0;i<n;++i)
        {
            scanf("%lf%lf%lf%lf",&nodes[i].x1,&nodes[i].x2,&nodes[i].y1,&nodes[i].y2);
            x[num1++]=nodes[i].x1;
            x[num1++]=nodes[i].x2;
            y[num2++]=nodes[i].y1;
            y[num2++]=nodes[i].y2;
        }
        sort(x,x+num1);
        sort(y,y+num2);
        num1=unique(x,x+num1)-x;//去重
        num2=unique(y,y+num2)-y;//去重
 
        for(int i=0;i<n;++i)
        {
            //找出第i个原始大矩形覆盖的小矩形范围
            int L_x=find(x,nodes[i].x1,num1);
            int R_x=find(x,nodes[i].x2,num1);
            int L_y=find(y,nodes[i].y1,num2);
            int R_y=find(y,nodes[i].y2,num2);
 
            for(int j=L_x;j<R_x;++j)
            for(int k=L_y;k<R_y;++k)
                mp[j][k]=true;
        }
        double ans=0;
        for(int i=0;i<num1;++i)
        for(int j=0;j<num2;++j)if(mp[i][j])
            ans += (x[i+1]-x[i])*(y[j+1]-y[j]);
            int a=(int) ans;
        printf("%d",a);
    }
 
    return 0;
}

运行结果-1

运行结果-2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值