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

来源:互联网 发布:vue.js if else 编辑:程序博客网 时间:2024/05/29 07:10

数长方形

 
 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
243 0 3 34 0 4 32 1 5 12 2 5 243 0 3 34 0 4 32 1 5 12 2 -5 2
Sample Output
Case #1:1Case #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;}


0 0
原创粉丝点击