hdu 5839

找立体四边形,至少4边相等;如果4边相等,不相等的两边必须相对。

比赛中一直没想通怎么统计正四面体,看题结,竟然是暴力。。。想想就能出数据hack了,不过,谁让数据水呢。。。

#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <stack>
#include <cstdlib>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>

using namespace std;
int cas=1;
struct Point3
{
    int x,y,z;
}a[210];
int onepanel(Point3 a1,Point3 a2,Point3 a3,Point3 a4)
{
    int A = ((a2.y-a1.y)*(a3.z-a1.z)-(a2.z-a1.z)*(a3.y-a1.y));
    int B = ((a2.z-a1.z)*(a3.x-a1.x)-(a2.x-a1.x)*(a3.z-a1.z));
    int C = ((a2.x-a1.x)*(a3.y-a1.y)-(a2.y-a1.y)*(a3.x-a1.x));
    int D = -(A * a1.x + B * a1.y + C * a1.z);
    int ret = A*a4.x+B*a4.y+a4.z*C+D;
    if (ret==0) return 1;
    else return 0;
}
int dis(Point3 a,Point3 b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}
map<int,int>mp;
map<int,int>::iterator it;
int main()
{
    int T;
    scanf ("%d",&T);
    while (T--)
    {
        int n;
        scanf ("%d",&n);
        for (int i=0;i<n;i++)
        {
            scanf ("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
        }
        int ans=0,zheng=0;
        for (int i=0;i<n;i++)
        {
            for (int j=i+1;j<n;j++)
            {
                mp.clear();
                int thi=dis(a[i],a[j]);
                for (int k=0;k<n;k++)
                {
                    if (k!=i&&k!=j)
                    {
                        int ta=dis(a[i],a[k]),tb=dis(a[j],a[k]);
                        if (ta==tb)
                        {
                            if (mp.find(ta)==mp.end())
                                mp[ta]=0;
                            mp[ta]++;
                        }
                    }
                }
                for (it=mp.begin();it!=mp.end();++it)
                {
                    if (it->second>=2)
                    {
                        ans+=(it->second)*(it->second-1)/2;
                    }
                }
            }
        }
        printf ("%d\n",ans);
        ans/=2;
        int ccc=0;
        for (int i=0;i<n;i++)
        {
            for (int j=i+1;j<n;j++)
            {
                for (int k=0;k<n;k++)
                {
                    if (k!=i&&k!=j&&dis(a[i],a[j])==dis(a[i],a[k])&&dis(a[i],a[j])==dis(a[k],a[j]))
                    {
                        for (int l=0;l<n;l++)
                        {
                            if (k!=l&&dis(a[i],a[j])==dis(a[i],a[l])&&dis(a[i],a[j])==dis(a[j],a[l])&&dis(a[i],a[j])==dis(a[k],a[l]))
                                ccc++;
                        }
                    }
                }
            }
        }
        printf ("%d\n",ccc);
        printf ("Case #%d: %d\n",cas++,ans-ccc/6);
    }
    return 0;
}

 

posted on 2016-09-04 17:18  very_czy  阅读(274)  评论(0编辑  收藏  举报

导航