hdu 3952

因为一个小错 不过  好不爽........

#include <iostream>
#include <fstream>
using namespace std;
struct Node
{
    int x, y;
};
class shap
{
public:
    int num;
    Node dian[22];
} q[22];
double getk(int x1, int y1, int x2, int y2)
{
    return (double)(y1-y2)/(double)(x1-x2);
}
double esp = 1e-7;
int main(void)
{
//    freopen("1.txt", "r", stdin);
    int kase;
    cin>>kase;
    int n;
    int count = 1;
    while(kase-- && cin>>n)
    {
        int m;
        for(int i = 0; i < n; i++)
        {
            cin>>m;
            q[i].num = m;
            for(int j = 0; j < m; j++)
                cin>>q[i].dian[j].x>>q[i].dian[j].y;
        }
        if(n <= 2)
        {
            printf("Case %d: %d\n", count++, n);
            continue;
        }
        int _max = 2;
        for(int i = 0; i < n; i++)
        {
            for(int j = i+1; j < n; j++)
            {
                for(int k = 0; k < q[i].num; k++)
                {
                    for(int g = 0; g < q[j].num; g++)
                    {
                        int a = q[i].dian[k].x;
                        int b = q[i].dian[k].y;

                        int c = q[j].dian[g].x;
                        int d = q[j].dian[g].y;

                        int cnt = 2;
                        if(a == c)
                        {
                            for(int ii = 0; ii < n; ii++)
                            {
                                if(ii == i || ii == j)
                                    continue;
                                int x = a;
                                int ok = q[ii].dian[0].x < x? -1:1;

                                if(q[ii].dian[0].x  == x)
                                {
                                    cnt++;
                                    continue;
                                }
                                //0表示点在下方
                                for(int jj = 1; jj < q[ii].num; jj++)
                                {
                                    int pos = q[ii].dian[jj].x < x? -1:1;
                                    if(q[ii].dian[jj].x  == x)
                                    {
                                        cnt++;
                                        break;
                                    }
                                    if(ok * pos == -1)
                                    {
                                        cnt++;
                                        break;
                                    }
                                }
                            }
                            continue;
                        }
                        double k = getk(a, b, c, d);
                        double bi = b  - k*a;

                        //枚举第三个多边形
                        for(int ii = 0; ii < n; ii++)
                        {
                            if(ii == i || ii == j)
                                continue;
                            //0表示点在下方
                            if(k*q[ii].dian[0].x + bi - q[ii].dian[0].y == 0)
                            {
                                cnt++;
                                continue;
                            }
                            int ok = k*q[ii].dian[0].x + bi - q[ii].dian[0].y < 0? -1:1;
                            for(int jj = 1; jj < q[ii].num; jj++)
                            {
                                int pos = k*q[ii].dian[jj].x + bi - q[ii].dian[jj].y < 0? -1:1;
                                if(k*q[ii].dian[jj].x + bi - q[ii].dian[jj].y == 0)
                                {
                                    cnt++;
                                    break;
                                }
                                if(ok * pos == -1)
                                {
                                    cnt++;
                                    break;
                                }
                            }
                        }
                        _max = max(cnt, _max);
                    }
                }
            }
        }
        printf("Case %d: %d\n", count++, _max);
    }


    return 0;
}


posted @ 2013-08-16 19:11  xlc2845  阅读(88)  评论(0)    收藏  举报