请告知我不涉及哪种情况

时间:2019-05-25 17:12:04

标签: c geometry rectangles area cartesian-coordinates

  
      
  • 给出两个平行于坐标轴的矩形,找到它们覆盖的区域。
  •   

输入格式: 输入的第一行包含T-测试用例数。其后是2T线。每个测试用例的第一行包含4个整数-xbl,ybl,xtr,ytr-矩形1的左下角和右上角坐标。每个测试用例的第二行包含4个整数-xbl,ybl,xtr,ytr-矩形2的左下角和右上角坐标。

约束

  • 1 <= T <= 10000
  • -10 6 6
  • (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;
}

变量x1,y1是左下角的坐标,x2,y2是右上角的坐标            矩形1的坐标。            变量x3,y3是左下角的坐标,而x4,y4是右上角的坐标            矩形2的坐标。

1 个答案:

答案 0 :(得分:0)

  

请告知我不涉及哪种情况

使用更广​​泛的数学

在给出-10 6 6 的情况下,

area=(x2-x1)*(y2-y1);容易发生int溢出。

最大面积约为4 * 10 12 ,超出大多数int实现(32位或16位)的范围。

long long至少覆盖 范围-(2 63 +1)... +(2 63 +1 )

long long recarea(int x1, int y1, int x2, int y2) {
    long long area = (0LL + x2 - x1)*(0LL + y2 - y1);
    return llabs(area);
}

   long long area = recarea(...
   printf("%lld\n",area);

也调整overarea()

其他

可能存在其他功能问题。示例:int可以小到16位。考虑使用long代替处理-10 6 6 。


在旁边

代码在fmin(), fmax()中使用浮点函数。我只使用整数方法,而不是在FP和整数之间切换时会引起各种问题。考虑到较小的范围,此处看起来不错,但对于较大的值则不是。