CCF- CSP 202303-1田地丈量 详细注释+满分题解(建议画图理解)
思路:
- 此题就是需要求解两个矩形的重叠面积,重点在于分类讨论的情况需要不重不漏
- 首先需要排除没有重叠的情况,即
x1>=a||x2<=0||y2<=0||y1>=b
- 根据土地左下方点所在位置进行讨论
- 当点在区域左侧、中间和右侧(已排除)时进行讨论
- 同样对宽进行讨论,有三种情况,具体情况见注释
- 此题建议大家耐心画图,把图画准确,仔细分析,题目不难
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int n,a,b;//分别表示西西艾弗岛上田地块数和顿顿选定区域的右上角坐标。
int main()
{
cin>>n>>a>>b;
int sum = 0;//统计最终的面积
for(int i=1;i<=n;i++)
{
int x1,x2,y1,y2;//表示一块田地的位置
int s = 0;//该块田地与选定区域围成的面积
int l1,l2;//记录围成面积的长和宽,用于计算面积
cin>>x1>>y1>>x2>>y2;
//当该块田地与选定区域没有重叠部分时
if(x1>=a||x2<=0||y2<=0||y1>=b)
{
continue;
}
//当该块田地最左侧位于选定区域的左侧,及x1<=0时
else if(x1<=0)
{
l1 = min(x2,a);//围成面积的长度不能超过a
}
else
{
if(x2>=a)
{
l1 = a-x1;//田地左边部分重叠
}
else
{
l1 = x2-x1;//田地在选定区域中间
}
}
//对宽所在位置进行讨论
if(y1<=0)
{
l2 = min(y2,b);//田地的右上角部分重叠,围成面积的宽不能超过b
}
else if(y2<=b)
{
l2 = y2-y1;//重叠部分在整个选定区域的中间
}
else
{
l2 = b-y1;//田地的右下角部分重叠
}
s = l2*l1;//计算面积
sum+=s;
}
cout<<sum<<endl;
return 0;
}