gpt4 book ai didi

c - 请告知我没有涵盖哪种情况

转载 作者:行者123 更新时间:2023-11-30 16:17:14 27 4
gpt4 key购买 nike

  • Given 2 rectangles parallel to coordinate axes, find the area covered by them.

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

约束

  • 1 <= T <= 10000
  • -106 < x,y <= 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;
}

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

最佳答案

Please advise which case I am not covering

使用更广​​泛的数学

area=(x2-x1)*(y2-y1); 给定 -106 < x, 很容易发生 int 溢出y <= 106

最大区域约为 4*1012,超出了大多数 int 实现(32 或 16 位)的范围。

long long 覆盖至少范围 -(263 + 1) ... +(263 + 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 来代替处理 -106 < x,y <= 106

<小时/>

旁白

代码使用带有fmin()、fmax()的浮点函数。我使用了仅整数的方法,而不是在 FP 和整数之间切换时出现各种问题。考虑到范围较小,这里看起来不错,但对于较大的值则不然。

关于c - 请告知我没有涵盖哪种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56307028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com