目录
题目描述
用具有x,y两个整型变量成员的结构类型SPoint来表示坐标点。用SRect结构类型来描述矩形,其中包含p1和p2两个SPoint成员分别表示矩形对角线上的两个点。
编写判断两个矩形是否重叠的函数bool isoverlap(const SRect &rect1, const SRect &rect2)。
主函数输入两个矩形,调用isoverlap函数判断是否重叠。
输入
判断次数
矩形1的对角线顶点坐标x1、y1、x2、y2
矩形2的对角线顶点坐标x1、y1、x2、y2
……
输出
是否重叠
输入样例1
3
1 5 2 9
1 3 2 4
5 6 7 8
5 7 7 9
2 5 1 0
9 4 2 9
输出样例1
not overlapped
overlapped
overlapped
思路分析
这道题坑很多。
我们首先来看一下如何怎么解决这道题。
首先它给出的只是对角线顶点坐标并没有说是哪个对角线,所以我们首先要处理一下,把它变成次对角线的两个坐标,即左下角的坐标和右上角 的坐标,具体方法是把大的坐标放到右边,小的放坐标,代码中的standard函数就是用来干这个的。
完了之后怎么知道重不重叠呢?
判断不重叠应该更方便一些,那什么情况下两个矩阵不重叠?
就是一个矩阵在另一个矩阵的周围,以一个矩阵为中心,四条边可以划出八个区域,这八个区域又可分成上下左右四种情况,对于每一种情况都只是需要进行坐标与坐标之间的比较就行。
还要注意的是,在这道题,沾边也算重叠。
AC代码
#include"iostream"
using namespace std;
struct SPoint
{
int x,y;
};
struct SRect
{
SPoint p1,p2;
};
bool isoverlap(const SRect &rect1, const SRect &rect2)
{
if(rect1.p1.x>rect2.p2.x||rect1.p1.y>rect2.p2.y||rect1.p2.x<rect2.p1.x||rect1.p2.y<rect2.p1.y)
return 0;
return 1;
}
void standard(SRect &rect)
{
if(rect.p1.x>rect.p2.x)
swap(rect.p1.x,rect.p2.x);
if(rect.p1.y>rect.p2.y)
swap(rect.p1.y,rect.p2.y);
}
int main()
{
int n;
SRect rect1,rect2;
cin>>n;
while(n--)
{
cin>>rect1.p1.x>>rect1.p1.y>>rect1.p2.x>>rect1.p2.y;
cin>>rect2.p1.x>>rect2.p1.y>>rect2.p2.x>>rect2.p2.y;
standard(rect1);
standard(rect2);
if(isoverlap(rect1,rect2))
cout<<"overlapped"<<endl;
else
cout<<"not overlapped"<<endl;
}
}