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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值