CCF-CSP 202303-1 田地丈量

文章讲述了如何解决CCF-CSP2023中的田地丈量问题,给出了C++和Python两种语言的代码实现,涉及输入田地坐标信息,计算选定矩形区域内的已存在田地面积,以及场景拓展到农业和城市规划应用。
摘要由CSDN通过智能技术生成

😸题目要求

🐈‍⬛问题描述

西西艾弗岛上散落着 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 n100,且所有输入坐标的绝对值均不超过 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数学关系的转化,如何将几何与数学关系结合在一起是本题的重点。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值