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