C题 - 覆叶之交
题意:
分别给出三个矩形的左下角和右上角坐标,求三个举行的重叠面积。
思路
在集合论(Set Theory)中,有公式:A∪B∪C = A + B + C - A∩B - A∩C - B∩C + A∩B∩C 在本题中适用。
具体解题步骤为:
- 计算三个矩形各自的面积
- 计算三个矩形两两之间重叠的面积
- 计算三个矩形的重叠面积
- 根据公式得出结果
细节处理在代码注释部分标出
具体实现代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
// 计算面积函数 - 输入两顶点坐标,返回面积
ll area(vector<int>& point1, vector<int>& point2){
if(point1[0]>=point2[0] || point1[1]>=point2[1]){ // 两“顶点”间无有效面积
return 0LL; // long long类型的0
}
ll longth = point2[0]-point1[0];
ll width = point2[1]-point1[1];
return longth*width;
}
// 计算两矩形重叠面积 - 输入两组矩形顶点,返回面积
ll double_area(vector<vector<int>>& a, vector<vector<int>>& b){
vector<int> point1(2), point2(2); // "重叠部分"的左下角和右上角顶点
point1[0] = max(a[0][0], b[0][0]);
point1[1] = max(a[0][1], b[0][1]);
point2[0] = min(a[1][0], b[1][0]);
point2[1] = min(a[1][1], b[1][1]);
return area(point1, point2);
}
// 计算三矩形重叠面积 - 输入三组矩形顶点,返回面积
ll triple_area(vector<vector<int>>& a, vector<vector<int>>& b, vector<vector<int>>& c){
vector<int> point1(2), point2(2);
point1[0] = max(max(a[0][0], b[0][0]), c[0][0]);
point1[1] = max(max(a[0][1], b[0][1]), c[0][1]);
point2[0] = min(min(a[1][0], b[1][0]), c[1][0]);
point2[1] = min(min(a[1][1], b[1][1]), c[1][1]);
return area(point1, point2);
}
// 解题函数
void solve(){
vector<vector<vector<int>>> vertices(3, vector<vector<int>> (2, vector<int>(2))); // 定义三维向量存储矩形信息 分别对应 【矩阵】【顶点】【横/纵坐标】
for(int i=0; i<3; i++){
for(int j=0; j<2; j++){
cin>>vertices[i][j][0]>>vertices[i][j][1]; // 输入矩阵顶点坐标信息
}
}
ll ans=0;
ans += area(vertices[0][0], vertices[0][1]) + area(vertices[1][0], vertices[1][1]) + area(vertices[2][0], vertices[2][1]);
ans -= double_area(vertices[0], vertices[1]) + double_area(vertices[2], vertices[1]) + double_area(vertices[0], vertices[2]);
ans += triple_area(vertices[0], vertices[1], vertices[2]);
cout<<ans;
return;
}
int main() {
ios::sync_with_stdio(false); // 禁止cin与scanf混用,加快cin/cout效率
cin.tie(nullptr); // 取消cin和cout之间的关联
solve();
return 0;
}