CSP-202303-1-田地丈量
解题思路
-
问题描述:给定一个长为
a、宽为b的矩形区域(坐标范围从(0,0)到(a,b)),以及n个其他矩形,每个矩形由其对角线的两个顶点(x1, y1)和(x2, y2)定义。需要计算这些矩形与给定矩形区域的交集部分的总面积。 -
输入格式:首先输入三个整数
n,a,b,分别代表矩形的数量和矩形区域的长和宽。接下来n行,每行有四个整数x1,y1,x2,y2,表示一个矩形的两个对角顶点坐标。 -
算法思路:
- 定义一个辅助函数
inRange(x, y)来判断一个点是否位于给定矩形区域内。 - 遍历每一个输入的矩形,对于每一个矩形:
- 检查矩形的任意一个角是否位于给定的矩形区域内。
- 如果至少有一个角在区域内,计算交集矩形的边界:
xMin(交集矩形的最小x值)、yMin(最小y值)、xMax(最大x值)和yMax(最大y值)。这些值分别通过取最大值和最小值来保证交集矩形位于给定矩形区域内。 - 计算交集矩形的面积,并累加到
sumSquare变量中。
- 最后,输出总面积
sumSquare。
- 定义一个辅助函数
-
特殊情况处理:只有当输入矩形的至少一个角落在给定矩形区域内时,这两个矩形的交集才被考虑。此外,还需要考虑边界情况,确保交集矩形不会超出给定矩形区域的边界。
完整代码
#include <iostream>
#include <algorithm>
using namespace std;bool inRange(int x, int y) {return 0 <= x && x <= a && 0 <= y && y <= b;
}
int n, a, b, xMax, xMin, yMax, yMin, y, xx1, xx2, yy1, yy2, sumSquare;int main() {cin >> n >> a >> b;for (size_t i = 0; i < n; i++){cin >> xx1 >> yy1 >> xx2 >> yy2;if (inRange(xx1, yy1) || inRange(xx2, yy2) || inRange(xx1, yy2) || inRange(xx2, yy1)){xMin = max(0, xx1), yMin = max(0, yy1);xMax = min(a, xx2), yMax = min(b, yy2);sumSquare += abs(xMax - xMin) * abs(yMax - yMin);}}cout << sumSquare;return 0;
}