【发布时间】:2019-10-11 21:44:11
【问题描述】:
- 给定 2 个平行于坐标轴的矩形,找出它们所覆盖的区域。
输入格式: 输入的第一行包含 T - 测试用例数。其后是 2T 线。每个测试用例的第一行包含 4 个整数 - xbl、ybl、xtr、ytr - rectangle-1 的左下角和右上角坐标。每个测试用例的第二行包含 4 个整数 - xbl、ybl、xtr、ytr - rectangle-2 的左下角和右上角坐标。
约束
- 1
- -1066
- (xbl, ybl)
输出格式: 对于每个测试用例,打印由 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 个测试用例。
-
如果
x1 = -99999, y1 = -99999, x2 = 99999, y2 = 99999则您的代码将溢出 32 位int的大小。如果是这种情况,那么您应该使用int64_t。
标签: c geometry rectangles area cartesian-coordinates