【CCF CSP】202303-1 田地丈量

1. 题目要求

在这里插入图片描述

2. 前提

3. 思想

第一种思路(繁琐复杂,容易遗漏情况):我观察到,如果有一个点坐标在矩形内部,想要算出被截的矩形面积,可以分四种情况讨论,分别是已有田地的左下点坐标在内部,已有田地的右上点坐标在内部,已有田地的左上点坐标在内部,已有田地的右下点坐标在内部,不同情况所对应的计算公式不同。(得分0分)
但是,运行错误,后来发现遗漏了没有点、两个点、四个点在矩形内部的情况。如果都加上发现极其麻烦。
加上某几种情况后,得分60。

第二种思路(参考别人的答案):仔细观察,结合多种情况,可以得出一个计算通式。
本质是求矩阵之间的交集面积,通过画图观察找出规律。交叉部分面积(以两个矩形为例),交叉部分矩阵右边界即原两个大矩阵的右边界中的较小值,左边界即原两个大矩阵的左边界中的较大值。因此,交叉矩阵的宽即为右边界减去左边界x = min(a, x2) - max(0, x1);同理可得上边界和下边界的关系 y = min(b, y2) - max(0, y1);最后,通过判断x 和 y是否大于零,从而判断两个矩阵之间是否存在交叉部分,若存在则 sum += x * y;

哎,这种找规律的题真的是。。。。。。

3. 代码

!!错误代码-60分!!

#include <iostream>
using namespace std;

int main(){
    int n,a,b;
    int x1,x2,y1,y2;
    int allArea = 0;
    int partArea;
    cin >> n >>a >> b;
    for(int i = 0; i < n; i++){
        cin >> x1 >> y1 >> x2 >> y2;
        if(x1>0&&x1<a&&y1>0&&y1<b){
            partArea = (a-x1)*(b-y1);
        }else if(x2>0&&x2<a&&y2>0&&y2<b){
            partArea = x2*y2;
        }else if(x1>0&&x1<a&&y2>0&&y2<b){
            partArea = (a-x1)*y2;
        }else if(x2>0&&x2<a&&y1>0&&y1<b){
            partArea = x2*(b-y1);
        }else if(x1<0&&x2>0&&y1<0&&y2>0){
            allArea = a*b;
            break;
        }else{
            partArea = 0;
        }
        allArea += partArea;
    }
    cout << allArea << endl;
    return 0;
}

#include <iostream>
#include <math.h>
using namespace std;

int main(){
    int n,a,b;
    int x1,x2,y1,y2;
    int allArea = 0;
    cin >> n >>a >> b;
    for(int i = 0; i < n; i++){
        cin >> x1 >> y1 >> x2 >> y2;
        int deltaX =  min(x2,a)-max(x1,0);
        int deltaY = min(y2,b) - max(y1,0);
        if(deltaX>0&&deltaY>0)
            allArea += deltaX*deltaY;
    }
    cout << allArea << endl;
    return 0;
}

4. 结果

在这里插入图片描述

5. 总结

6. 参考代码

https://blog.csdn.net/sun_kingngfyncfh/article/details/129739117

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值