CCF-CSP 202303-1 田地丈量
😸题目要求
🐈⬛问题描述
西西艾弗岛上散落着
n
n
n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1) 和右上角坐标
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2) 唯一确定,且满足
x
1
<
x
2
x_1<x_2
x1<x2、
y
1
<
y
2
y_1<y_2
y1<y2。这
n
n
n 块田地中,任意两块的交集面积均为
0
0
0,仅边界处可能有所重叠。
最近,顿顿想要在南山脚下开垦出一块面积为
a
×
b
a×b
a×b 矩形田地,其左下角坐标为
(
0
,
0
)
(0,0)
(0,0)、右上角坐标为
(
a
,
b
)
(a,b)
(a,b)。试计算顿顿选定区域内已经存在的田地面积。
🐈⬛输入格式
从标准输入读入数据。
输入共
n
+
1
n+1
n+1 行。
输入的第一行包含空格分隔的三个正整数
n
n
n、
a
a
a 和
b
b
b,分别表示西西艾弗岛上田地块数和顿顿选定区域的右上角坐标。
接下来
n
n
n 行,每行包含空格分隔的四个整数
x
1
x_1
x1、
y
1
y_1
y1、
x
2
x_2
x2 和
y
2
y_2
y2,表示一块田地的位置。
🐈⬛输出格式
输出到标准输出。
输出一个整数,表示顿顿选定区域内的田地面积。
🐈⬛样例输入
4 10 10
0 0 5 5
5 -2 15 3
8 8 15 15
-2 10 3 15
🐈⬛样例输出
44
🐈⬛样例解释
如图所示,选定区域内田地(绿色区域)面积为 44。
🐈⬛子任务
全部的测试数据满足 n ≤ 100 n \leq 100 n≤100,且所有输入坐标的绝对值均不超过 1 0 4 10^4 104。
😸问题解决
🐈满分代码(含逐行代码解释)
🍭C++
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, a, b;
cin >> n >> a >> b;
int x1[10001], y1[10001], x2[10001], y2[10001];
for(int i = 0; i < n; i++){
cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
}
int area = 0; //表示最终累加在一起的田地总面积
int x, y; //表示每一小块田地的长和宽
for(int i = 0; i < n; i++){
x = min(a, x2[i]) - max(0, x1[i]);
y = min(b, y2[i]) - max(0, y1[i]);
//这里注意求的是所划地块内所有现有田地的面积之和,原理即为上述两行代码,这是一个数学问题
if(x > 0 && y > 0) { //因为所划地块是从(0,0)到(a,b)所以所求田地不会出现在第二三四象限的
area += x * y;
} //这个条件判断易错,需要特别注意!!!
}
cout << area << endl;
return 0;
}
🍭Python
n, a, b = map(int, input().split())
x1, y1, x2, y2 = [], [], [], []
for i in range(n):
x1i, y1i, x2i, y2i = map(int, input().split())
x1.append(x1i)
y1.append(y1i)
x2.append(x2i)
y2.append(y2i)
area = 0
for i in range(n):
x = min(a, x2[i]) - max(0, x1[i])
y = min(b, y2[i]) - max(0, y1[i])
if x > 0 and y > 0:
area += x * y
print(area)
🐈场景拓展
本题代码可以用于计算给定矩形区域(左下角为原点)内,若干个不规则图形的面积之和。这种场景很常见,例如在农业领域,农民们需要计算自己的土地面积,或者在城市规划中需要计算某一区域内建筑物的总面积。尤其注意代码中对于min和max数学关系的转化,如何将几何与数学关系结合在一起是本题的重点。