题目描述
给你两个平行于坐标轴的矩形,请判断两者是不是相交(面积有重合的部分)?
输入
第一行是一个整数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代码:
#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;
}