题目描述
给你两个平行于坐标轴的矩形,请判断两者是不是相交(面积有重合的部分)?
输入
第一行是一个整数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
解题思路:
1:把两个矩形的对角线都化成,左下---右上的对角线 (代码 23、24 行)
2:把两个对角线的坐标大小排好序,让 (a1,b1) 是 最左下的点。 (26、27行,手动模拟、琢磨一下)
3:如果 (c1,d1) 在对角线为 (a1,b1) 、(a2,b2) 的 矩形的内部,那么这两个矩形就是相交的,反之不然。
如图:
AC代码:
cpp
#include <stdio.h>
void swap(int &x,int &y)
{
if ( x > y)
{
int t = x;
x = y;
y = t;
}
}
int main()
{
int k;
int a1,a2,b1,b2;
int c1,c2,d1,d2;
scanf("%d",&k);
while ( k-- )
{
scanf("%d %d %d %d",&a1,&b1,&a2,&b2);
scanf("%d %d %d %d",&c1,&d1,&c2,&d2);
swap(a1,a2); swap(b1,b2); //a1,b1 在左下角, a2,b2 在右上角
swap(c1,c2); swap(d1,d2); //都化成 (左下,右上) 的对角线
swap(a1,c1); swap(a2,c2); //小中取大:c1,大中取小:a2; 比较横坐标;
swap(b1,d1); swap(b2,d2); //同理; 比较纵坐标;
if (c1 < a2 && d1 < b2) puts ("Yes");
else puts ("No");
}
return 0;
}