CCF刷题计划——田地丈量

田地丈量

计算机软件能力认证考试系统

本题可以学到:重合部分矩形面积求法——对角坐标法

这道题杀疯了。我还以为只是一个简单模拟,但是实际上如果用正常几何方式思考的话,有超多情况,做成分类极其麻烦。我想过用点作为分类的条件,那么情况只有三个,一个点在矩形内部,还有两个点在矩形内部,四个点都在。但是发现点作为观测点非常不可信,因为如果四个点都不在矩形内,真的就不会有交集了吗?也不是,如果划的矩形超级大,那么重合的面积就是a*b,但是如果按照我之前的思路的话,就是没有交集。

下面来说说正确思路:求重合部分矩形的对角坐标(下面定义为 lx,ly,rx,ry)。为什么要求这个呢?假设我们存在这个重合矩形,并且知道了重合部分的对角坐标,那么长和宽就可以秒出,计算面积也就水到渠成。怎么求这个呢?我们先假设存在,那么这个重合矩形的左下角,最少是(0,0),所以 lx、ly>=0吧?而最大是多少呢?因为是左下,所以相对而言是要挑最小的,可以画图,简单看出,最大是x1,y1。同理,右上角也是,最大最大是(a,b),所以 rx<=a,ry<=b。 如果不存在这个矩形呢?不妨先按上述方法试试,试了之后就爽了,因为发现如果不存在,这两个点会在同一水平线上,所以rx=lx,计算出来的面积=0,我们可以不用分类,直接用上述方法。

AC:

#include <iostream>
using namespace std;
//好妙的一道题,说实话,几何题我一直不怎么在行。这道题的灵魂在于求出两个矩形相交部分的对角坐标 
//如果相交,那当然会有这个坐标,如果不相交,那经过上述方法计算出来的坐标在一个水平线上,根据这个算出来的面积为0 
#define ll long long
int n,a,b;
ll ans=0; 

int main()
{
	cin>>n>>a>>b;
	int x1,x2,y1,y2;	// 2>1 
	int leftx,lefty,rightx,righty;	//设置相交矩形左右(其实是左下和右上)坐标 
	while(n--)
	{
		cin>>x1>>y1>>x2>>y2;
		leftx=max(0,x1);
		lefty=max(0,y1);
		rightx=min(a,x2);
		righty=min(b,y2);
		
		//如果没有交集,leftx-rightx=0 
		int w=max(0,rightx-leftx);	//右上坐标都大于左下 
		int h=max(0,righty-lefty);
		ans+=h*w;
	}
	cout<<ans;
	return 0;
 } 

CCF CSP认证考试中的土地丈量,是指在西西艾弗岛上散落着一些田地,每块田地都可以视为平面直角坐标系下的一个矩形区域。这些田地由左下角坐标和右上角坐标唯一确定,并且任意两块田地的交集面积为0,仅边界处可能有所重叠。现在的问题是,如何计算在选定的区域内已经存在的田地面积。 为了计算已经存在的田地面积,我们可以遍历所有的田地,判断它们与选定区域的关系。如果一个田地完全包含在选定区域内部,那么它的面积应该被计入。如果一个田地与选定区域有部分重叠,我们需要计算出重叠部分的面积并加入总面积中。 具体实现的方法可以是: 1. 遍历所有的田地,对于每个田地,判断它是否与选定区域存在交集。 2. 如果存在交集,计算出交集的左下角坐标和右上角坐标,然后计算出交集的面积,并将其加入总面积中。 3. 继续遍历下一个田地,重复上述步骤,直到遍历完所有的田地。 4. 最后得到的总面积即为已经存在的田地面积。 需要注意的是,由于题目中已经说明了任意两块田地的交集面积为0,所以我们可以直接判断两个矩形是否有交集,而不需要进行复杂的计算。另外,需要注意边界情况,例如田地的边界与选定区域的边界重合时如何处理。 通过以上的方法,我们可以准确地计算出已经存在的田地面积。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [第29次CCF CSP 认证题目 第一题 202303-1 田地丈量 C++实现 满分答案](https://blog.csdn.net/sun_kingngfyncfh/article/details/129739117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值