题解:P12326 [蓝桥杯 2023 省 Java B] 矩形总面积

· · 题解

题意

给你两个矩阵的左下角和右上角坐标,让你求这两个矩阵的总面积,两个矩阵有可能重叠,重叠部分只算一次

思路

算出两个矩阵的面积的和,将其减去重叠部分的面积,然后就没了。注意:不开long long见祖宗!

算出两个矩阵的面积应该很容易,只需要用其右上角列坐标减去其左下角列坐标,再乘上其右上角横坐标减去其左下角横坐标,就能求出面积了。

算出重叠部分的面积稍微难一点,需要用第一个矩阵的右上角列坐标和第二个矩阵的右上角列坐标的最小值,减去第一个矩阵的左下角列坐标和第二个矩阵的左下角列坐标的最大值,算出重叠部分的高,然后再用第一个矩阵的右上角横坐标和第二个矩阵的右上角横坐标的最小值,减去第一个矩阵的左下角横坐标和第二个矩阵的左下角横坐标的最大值,算出重叠部分的宽,将高和宽相乘,就能算出重叠部分的面积了。

如果算重叠部分时出现负数或 0,就说明没有重叠部分,需要特判一下,直接算两个矩阵的面积的和即可。

AC 代码(C++)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int x[5];
int y[5];
signed main()
{
    for(int i=1;i<=4;i++)
    {
        scanf("%lld%lld",&x[i],&y[i]);
    }
  //读入
    int ret=abs(x[2]-x[1])*abs(y[2]-y[1]);
    int ans=abs(x[4]-x[3])*abs(y[4]-y[3]);
  //算出两个矩阵的面积
    int a=min(x[2],x[4]);
    int b=max(x[1],x[3]);
    int c=min(y[2],y[4]);
    int d=max(y[1],y[3]);
    int sum=0;
    if(a>b && c>d)//判一下有没有重叠部分,如果没有,sum保持不变,一直为0
    {
        sum=(a-b)*(c-d);
    }
  //算出重叠部分的面积
    printf("%lld",ret+ans-sum);
    return 0;
}