一开始做这道题的时候选择了一直else if,算的我头晕,还容易算错,整合代码后采用了一种比较简洁的计算方法解决该题!
一开始的一直else if .....
int main(){
cin>>n>>a>>b;
ll num = 0;
for(int i=0;i<n;i++){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if(x1>=a||y1>=b||x2<=0||y2<=0) num +=0;//无交集情况
else if(x1>=0&&y1>=0&&x2<=a&&y2<=b) num += (x2-x1)*(y2-y1); //中间
else if(x1<0&&x2>0&&y1<b&&y2>b) num += (b-y1)*(x2-0); //左上
else if(x1<a&&x2>a&&y1<b&&y2>b) num += (b-y1)*(a-x1); //右上
else if(x1<0&&x2>0&&y1<0&&y2>0) num += x2*y2; //左下
else if(x1<a&&y1<0&&x2>a&&y2>0) num += (a-x1)*(y2-0); //右下
else if(x1>0&&x2<=a&&y1<b&&y2>b) num += (b-y1) * (x2-x1); //上
else if(x1<a&&x2>a&&y1>=0&&y2<=b) num += (a-x1)*(y2-y1); //右
else if(x1>=0&&x2<=a&&y1<0&&y2>0) num += (y2-0)*(x2-x1); //下
else if(y1>=0&&y2<=b&&x1<0&&x2>0) num += (x2-0)*(y2-y1);
}
cout<<num<<endl;
return 0;
}
最终代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,a,b; //田地数,右上角坐标
int main(){
cin>>n>>a>>b;
ll num=0;
for(int i = 0;i<n;i++){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if(x2<=0||y2<=0||x1>=a||y2>=b) num += 0; //不重合情况
//实际重合部分点的坐标
int left = max(x1,0);
int right = min(x2,a);
int top = min(y2,b);
int bottom = max(y1,0);
num += (right-left)*(top-bottom); //累加重合面积
}
cout<<num<<endl;
return 0;
}