链接:http://acm.hdu.edu.cn/showproblem.php?pid=6665
题意:T组样例。求两个矩形能把平面分成几块。
思路:魔鬼分类讨论,wa到比赛结束。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
int x,y;
};
struct rec
{
node zx,ys;
}rs[3];
int xl1,xr1,xl2,xr2,yl1,yr1,yl2,yr2;
//排序
bool cmp(const rec& a,const rec& b)
{
if(a.zx.x==b.zx.x)
{
if(a.zx.y==b.zx.y)
{
if(a.ys.x==b.ys.x)
{
return a.ys.y<b.ys.y;
}
else return a.ys.x<b.ys.x;
}
else return a.zx.y<b.zx.y;
}
else return a.zx.x<b.zx.x;
}
bool deng(node a,node b)
{
if(a.x==b.x&&a.y==b.y)
return 1;
return 0;
}
bool judge5()
{
if(xl1<xl2&&xr1==xr2&&yr1<yr2&&yl2<yl1)
return 1;
if(xl1==xl2&&xr1<xr2&&yr2<yr1&&yl1<yl2)
return 1;
if(yr1==yr2&&yl2<yl1&&xl1<xl2&&xr2<xr1)
return 1;
if(yl1==yl2&&yr1<yr2&&xl1<xl2&&xr2<xr1)
return 1;
return 0;
}
bool judge6()
{
if(xl1<xl2&&xr2<xr1&&yr1<yr2&&yl2<yl1)
return 1;
return 0;
}
//不想交、共点、有公共边
bool judge3()
{
if(xr1<=xl2) return 1;
if(yr1<=yl2||yr2<=yl1) return 1;
return 0;
}
//包含的各种情况
bool judge3_1()
{
if(xl1==xl2&&xr1>xr2&&yl1<=yl2&&yr2<=yr1)
return 1;
if(xl1==xl2&&xr1<xr2&&yl1>=yl2&&yr2>=yr1)
return 1;
if(xr1==xr2&&xl1<xl2&&yl1<=yl2&&yr2<=yr1)
return 1;
if(xl1<xl2&&xr2<xr1&&yl1<yl2&&yr2<yr1)
return 1;
if(yl1==yl2&&yr2<yr1&&xl1<=xl2&&xr2<=xr1)
return 1;
if(yl1==yl2&&yr2>yr1&&xl1>=xl2&&xr2>=xr1)
return 1;
if(yr1==yr2&&yl1<yl2&&xl1<=xl2&&xr2<=xr1)
return 1;
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&rs[1].zx.x,&rs[1].zx.y,&rs[1].ys.x,&rs[1].ys.y);
scanf("%d%d%d%d",&rs[2].zx.x,&rs[2].zx.y,&rs[2].ys.x,&rs[2].ys.y);
sort(rs+1,rs+3,cmp);
xl1=rs[1].zx.x; xr1=rs[1].ys.x; xl2=rs[2].zx.x; xr2=rs[2].ys.x;
yl1=rs[1].zx.y; yr1=rs[1].ys.y; yl2=rs[2].zx.y; yr2=rs[2].ys.y;
//重合
if(deng(rs[1].zx,rs[2].zx)&&deng(rs[1].ys,rs[2].ys))
{
printf("2\n");
continue;
}
if(judge5())
{
printf("5\n");
continue;
}
if(judge6())
{
printf("6\n");
continue;
}
if(judge3())
{
printf("3\n");
continue;
}
if(judge3_1())
{
printf("3\n");
continue;
}
printf("4\n");
}
return 0;
}