AcWing寒假每日一题——Day37画图

在一个定义了直角坐标系的纸上,画一个 ( x 1 , y 1 ) 到 ( x 2 , y 2 ) (x1,y1) 到 (x2,y2) (x1,y1)(x2,y2)的矩形指将横坐标范围从 x 1 到 x 2 x1 到 x2 x1x2,纵坐标范围从 y 1 到 y 2 y1 到 y2 y1y2 之间的区域涂上颜色。

下图给出了一个画了两个矩形的例子。

第一个矩形是 (1,1) 到 (4,4),用绿色和紫色表示。

第二个矩形是 (2,3) 到 (6,5),用蓝色和紫色表示。

图中,一共有 15 个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。

在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

p21.png

给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。

输入格式
输入的第一行包含一个整数 n,表示要画的矩形的个数。

接下来 n 行,每行 4 个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。

输出格式
输出一个整数,表示有多少个单位的面积被涂上颜色。

数据范围
1 ≤ n ≤ 100 , 1≤n≤100, 1n100,
0 ≤ 横 坐 标 、 纵 坐 标 ≤ 100 0≤ 横坐标、纵坐标 ≤100 0100
输入样例:

2
1 1 4 4
2 3 6 5

输出样例:

15

分析: 每次都标记被涂色的方格,最后遍历整个方格,如果这个格子被涂色,就加上。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,x_1,y_1,x_2,y_2,res,mx,my;
bool st[N][N];
int main(){
    
    
    cin>>n;
    for(int i=0;i<n;i++){
    
    
        cin>>x_1>>y_1>>x_2>>y_2;
        mx=max(mx,x_2);
        my=max(my,y_2);
        for(int i=x_1;i<x_2;i++)
            for(int j=y_1;j<y_2;j++)
                st[i][j]=1;
    }
    for(int i=0;i<=mx;i++)
        for(int j=0;j<=my;j++)
            if(st[i][j]) res++;
    cout<<res<<endl;
}

猜你喜欢

转载自blog.csdn.net/messywind/article/details/113856843