传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6665
比赛中分情况讨论没过,队友用离散化跑dfs过了,十分精妙
赛后把情况讨论分对了,判断完全在外部的情况,相等的情况,两条对边有重合的情况,一个内含另一个但只可能相邻边重合的情况,其他剩下的相交的情况就都是4了。
#include<bits/stdc++.h>
using namespace std;
int ans;
struct node
{
int x1,y1,x2,y2;
}a,b;
inline void prework()
{
scanf("%d%d%d%d",&a.x1,&a.y1,&a.x2,&a.y2);
scanf("%d%d%d%d",&b.x1,&b.y1,&b.x2,&b.y2);
}
inline void mainwork()
{
if(b.x2<=a.x1 || b.x1>=a.x2 || b.y2<=a.y1 || b.y1>=a.y2)//完全在外部
{
ans=3;
return;
}
if(a.x1==b.x1 && a.x2==b.x2 && a.y1==b.y1 && a.y2==b.y2)//相等
{
ans=2;
return;
}
if(a.x1==b.x1 && a.x2==b.x2) // 两条对边有重合部分
{
if(b.y1==a.y1 || b.y2==a.y2)
{
ans=3;
return;
}
else
{
ans=4;
return;
}
}
if(a.y1==b.y1 && a.y2==b.y2) // 两条对边有重合部分
{
if(b.x1==a.x1 || b.x2==a.x2)
{
ans=3;
return;
}
else
{
ans=4;
return;
}
}
if(b.x1<=a.x1 && b.x2>=a.x2 && b.y1<=a.y1 && b.y2>=a.y2)//内涵且只有相邻边重合
{
ans=3;
return;
}
if(b.x1>=a.x1 && b.x2<=a.x2 && b.y1>=a.y1 && b.y2<=a.y2)//内涵且只有相邻边重合
{
ans=3;
return;
}
if(b.x1>=a.x1 && b.x2<=a.x2)//夹在中间
{
if(b.y1<=a.y1 && b.y2>=a.y2)
{
if(b.x1==a.x1 || b.x2==a.x2)
ans=3;
else
ans=4;
if(b.y1<a.y1)
ans++;
if(b.y2>a.y2)
ans++;
}
else
ans=4;
return;
}
if(b.y1>=a.y1 && b.y2<=a.y2)//夹在中间
{
if(b.x1<=a.x1 && b.x2>=a.x2)
{
if(b.y1==a.y1 || b.y2==a.y2)
ans=3;
else
ans=4;
if(b.x1<a.x1)
ans++;
if(b.x2>a.x2)
ans++;
}
else
ans=4;
return;
}
ans=4;
}
inline void print()
{
printf("%d\n",ans);
}
int main()
{
//freopen("i.in","r",stdin);
//freopen("i.out","w",stdout);
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}
本文详细解析了一道关于矩形重叠问题的算法题目,通过分情况讨论和代码实现,探讨了两个矩形在不同相对位置下的重叠判断及重叠区域的计算方法。

被折叠的 条评论
为什么被折叠?



