杭电2019多校第八场 HDU-6665 Calabash and Landlord(求两个矩形能把平面分成几块)

链接: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值