Description | ||
题目描述 给你两个平行于坐标轴的矩形,请判断两者是不是相交(面积有重合的部分)? 输入 第一行是一个整数K,表示样例数。 每个样例占两行,每行是4个整数,表示一个矩形的对角线点的坐标,坐标值为0到1,000之间。 输出 每个样例输出一个结果,相交输出Yes,否则输出No。 样例输入 2 0 0 1 1 1 1 2 2 0 0 2 2 1 1 3 3 样例输出 No Yes |
思路:
方法一:
分别找到2个矩形右下角的坐标中最小的x(minx)和最小的y(miny),再找到2个矩形左上角坐标中最大的x(maxx)和最大的y(maxy)。最后,相交的矩形即对角线[minx,miny]--[maxx,maxy]所构成的矩形,示例图如下(参考来自知乎参考资料)
注意:
题目中只是告诉了两个对角线的坐标,但是没有具体阐述哪一个是左下角的坐标,哪一个是右上角的坐标,因此需要先判断是左上角坐标还是右上角坐标。
左右上角判断依据:
左下角的横纵坐标一定是两个对角线坐标中横纵坐标最小的,右上角的横纵坐标一定是两个对角线坐标中横纵坐标最大的
由此:
两个矩形左下角对角线点的横坐标分别为:Min(x1, x2), Min(x3, x4)
找左下角横坐标中最大的:Max(Min(x1, x2), Min(x3, x4))
两个矩形右上角对角线点的纵坐标分别为:Max(x1, x2), Max(x3, x4)
找右上角横坐标中最小的:Min(Max(x1, x2), Max(x3, x4));
纵坐标同理
综上可得
X1 = Max(Min(x1, x2), Min(x3, x4));//最大的左下角横坐标
X2 = Min(Max(x1, x2), Max(x3, x4));//最小的右上角横坐标
Y1 = Max(Min(y1, y2), Min(y3, y4));//最大的左下角纵坐标
Y2 = Min(Max(y1, y2), Max(y3, y4));//最小的右上角纵坐标
if(X1 < X2 && Y1 < Y2) //最大的左下角横坐标 < 最小的右上角横坐标
//and 最大的左下角纵坐标 < 最小的右上角纵坐标时相交
完整代码:
#include <stdio.h>
#include<stdlib.h>
int Max(int x, int y) {
return x > y ? x : y;
}
int Min(int x, int y) {
return x > y ? y : x;
}
int main() {
int k;
scanf("%d",&k);
while(k--){
int x1, y1, x2, y2, x3, y3, x4, y4;
scanf("%d%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
int X1, Y1, X2, Y2, S,s;
X1 = Max(Min(x1, x2), Min(x3, x4));
X2 = Min(Max(x1, x2), Max(x3, x4));
Y1 = Max(Min(y1, y2), Min(y3, y4));
Y2 = Min(Max(y1, y2), Max(y3, y4));
S=abs(x2-x1)*abs(y2-y1)+abs(x4-x3)*abs(y4-y3);
s=abs(X2-X1)*abs(Y2-Y1);
if(X1 < X2 && Y1 < Y2)
printf("Yes\n");
else printf("No\n");
}
return 0;
}
方法二:
设2个矩形a,b的中心分别为oa 和ob,通过作图很容易发现 如果2个矩形要有交集必须满足2个条件:
oa ob横坐标距离<两矩形横边和/2 且 oaob纵坐标距离<两矩形纵边和/2 。
#include<stdio.h>
#include<math.h>
//设2个矩形a,b的中心分别为oa 和ob,通过作图很容易发现 如果2个矩形要有交集必须满足2个条件:
//
//oa ob横坐标距离<两矩形横边和/2 且 oaob纵坐标距离<两矩形纵边和/2 。
int main(){
int k;
scanf("%d",&k);
while(k--){
double x[5],y[5];
for(int i=0;i<4;i++){
scanf("%lf %lf",&x[i],&y[i]);
}
double x1,x2,y1,y2;
x1 = (x[0] + x[1]) / 2;//矩形1的中心横坐标
x2 = (x[2] + x[3]) / 2;//矩形2的中心横坐标
y1 = (y[0] + y[1]) / 2;//矩形1的中心纵坐标
y2 = (y[2] + y[3]) / 2;//矩形2的中心纵坐标
double disX = abs(x[0] - x[1]) + abs(x[2] - x[3]);//两个矩形长之和
double disY = abs(y[0] - y[1]) + abs(y[2] - y[3]);//两个矩形宽之和
if(abs(x1 - x2) < disX / 2 && abs(y1 - y2) < disY / 2) printf("Yes\n");
else printf("No\n");
}
return 0;
}
Description | ||
矩形面积的并题目描述给两个边平行于坐标轴的矩形,求两个矩形的面积并。 输入存在多个样例,每个样例包括2行,每行是一个矩形,为矩形一个对角线端点的坐标x1,y1,x2,y2,0≤x1,y1,x2,y2≤1000。 输出每行输出一个样例的结果。 样例输入0 0 1 1 0 0 2 1 0 0 2 2 1 1 3 3 0 0 1 1 2 2 3 3 0 0 2 1 1 1 2 2 样例输出2 7 2 3 |
思路:
这题是上面那题的兄弟题,只要用方法一,两个矩形的面积相加再减去相交部分的面积即可,但是注意两个矩形可能相交,也可能不相交。
#include <stdio.h>
#include<stdlib.h>
int Max(int x, int y) {
return x > y ? x : y;
}
int Min(int x, int y) {
return x > y ? y : x;
}
int main() {
int x1, y1, x2, y2, x3, y3, x4, y4;
while(scanf("%d%d%d%d", &x1, &y1, &x2, &y2)!=EOF)
{
scanf("%d%d%d%d", &x3, &y3, &x4, &y4);
int X1, Y1, X2, Y2, S,s;
X1 = Max(Min(x1, x2), Min(x3, x4));
X2 = Min(Max(x1, x2), Max(x3, x4));
Y1 = Max(Min(y1, y2), Min(y3, y4));
Y2 = Min(Max(y1, y2), Max(y3, y4));
S=abs(x2-x1)*abs(y2-y1)+abs(x4-x3)*abs(y4-y3);
s=abs(X2-X1)*abs(Y2-Y1);
if(X1 < X2 && Y1 < Y2)
printf("%d\n",S-s);
else printf("%d\n",S);
}
return 0;
}