- 给定两个平行于坐标轴的矩形,求它们所覆盖的面积。
**输入格式:**输入的第一行包含T -测试用例的数量。其后是2 T行。每个测试用例的第一行包含4个整数- xbl,ybl,xtr,ytr -矩形-1的左下和右上坐标。每个测试用例的第二行包含4个整数- xbl,ybl,xtr,ytr -矩形-2的左下和右上坐标。
制约因素
- 1〈= T〈= 10000
- -106
- (xbl,ybl)〈(xtr,ytr)
**输出格式:**对于每个测试用例,打印2个矩形覆盖的区域,用换行符分隔。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
unsigned int recarea(int x1,int y1,int x2,int y2){
int area=0;
area=(x2-x1)*(y2-y1);
return abs(area);
}
unsigned int overarea(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4){
int top=fmin(y2,y4);
int bottom=fmax(y1,y3);
int left=fmax(x1,x3);
int right=fmin(x2,x4);
int overlaparea=0;
if(bottom<top && left<right){
overlaparea=recarea(left,bottom,right,top);
}
return abs(overlaparea);
}
int main() {
int testcases=0;
scanf("%d",&testcases);
for(int i=0;i<testcases;i++){
int x1,x2,y1,y2,x3,x4,y3,y4;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
scanf("%d %d %d %d",&x3,&y3,&x4,&y4);
int area=recarea(x1,y1,x2,y2)+recarea(x3,y3,x4,y4)-
overarea(x1,y1,x2,y2,x3,y3,x4,y4);
printf("%d\n",area);
}
return 0;
}
对于矩形1,变量x1、y1是左下坐标,x2、y2是右上坐标。对于矩形2,变量x3、y3是左下坐标,x4、y 4是右上坐标。
1条答案
按热度按时间wqnecbli1#
请告知我不承保的情况
area=(x2-x1)*(y2-y1);
在给定-106最大面积约为4 * 1012,在大多数
int
实现(32或16位)的范围之外。long long
* 至少 * 涵盖范围-(263 + 1)...+(263 + 1)同时调整
overarea()
。可能存在其他功能问题。例如:
int
可以小到16位。请考虑改用long
来处理-106〈x,y〈= 106。代码在
fmin(), fmax()
中使用浮点函数。我使用了一个只使用整数的方法,而不是在FP和整数之间切换时遇到各种问题。在小范围内看起来还可以,但对于较大的值就不行了。