百度之星 2015 复赛 1001 (数长方形)

数长方形

 
 Accepts: 595
 
 Submissions: 1225
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形。小度熊可能是处女座吧,他只会将木棒横竖摆放,这样会形成很多长方形。现在给你一些横竖摆放的木棒,请你帮小度熊数一数形成了多少个长方形。

为了简化题目,一个木棒的端点不会在另一个木棒上,也就是说,木棒的端点不会在长方形上。

Input

第一行一个整数T,表示T组数据,不超过100组。

每组数据中,第一行是n,代表有多少个木棒,n不会超过25。接下来n行,每行4个整数 x1,y1,x2,y2 ,代表木棒的坐标,绝对值不超过1000。

所有的木棒都是横竖摆放的,也就是说 x1=x2 或者 y1=y2 ,没有长为0的木棒。

Output

对于每组测试数据,先输出一行

Case #i:

然后输出一个整数,代表有多少个长方形。

Sample Input
2
4
3 0 3 3
4 0 4 3
2 1 5 1
2 2 5 2
4
3 0 3 3
4 0 4 3
2 1 5 1
2 2 -5 2
Sample Output
Case #1:
1
Case #2:
0

直接暴力,每次枚举4条线段,判断是否有4个交点,有的话ans++

#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
#include <sstream>
#include <cstring>
using namespace std;
const int SIZE=33119;
typedef struct NODE  
{
    int x1,x2;
    int y1,y2;

};
NODE a[SIZE];


bool check(int i, int j)
{
        if(a[i].x1 == a[i].x2 && a[j].x1 != a[j].x2)
        {
            return a[i].x1 >= a[j].x1 && a[i].x1 <= a[j].x2 && a[i].y1 <= a[j].y1 && a[i].y2 >= a[j].y1;
        }
        else if( a[i].x1 != a[i].x2 && a[j].x1 == a[j].x2)
        {
            return a[j].x1 >= a[i].x1 && a[j].x1 <= a[i].x2 && a[j].y1 <= a[i].y1 && a[j].y2 >= a[i].y1;
        }

        return false;
}

bool solve(int b,int c, int d, int e)
{
     int w[4] = {b,c,d,e};

     int num = 0;
     for(int i = 0; i < 4; i++)
        for(int j = i+1; j < 4; j++)
            if(check(w[i],w[j])) num++;

     return num == 4;
}

int main()
{
    #ifdef xxz
     freopen("in.txt","r",stdin);
    #endif // xx

    int n,i,j,T;
    scanf("%d",&T);
    int Case = 1;
    while (T--)
    {
        scanf("%d",&n);
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
            if(a[i].x1 > a[i].x2) swap(a[i].x1,a[i].x2);
            if(a[i].y1 > a[i].y2) swap(a[i].y1,a[i].y2);
        }

          int ans = 0;
            for(int i = 0; i < n; i++)
                for(int j = i+1; j < n; j++)
                    for(int k = j+1; k < n; k++)
                        for(int l = k+1; l < n; l++)
                            if(solve(i,j,k,l)) ans++;

        printf("Case #%d:\n",Case++);
        printf("%d\n",ans);
    }

    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值