/*
hdu 5839
题目大体就是说
给你一对点找到符合以下要求的四面体
1.至少四条边相等(换句话说可以5条边或者6条边)
2.如果只有四条边相等那么不相等的两个边为对边
直接暴力
先用两个循环,枚举两个点,然后找到这两个点距离相等的点,放入一个数组。
然后在这个数组中,找两个符合条件的点。
注意每个正四面体算了四次,其余符合要求的算了两次。
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define mod 1000000007
#define maxn 10000005
#define ll long long
#define PI acos(-1)
using namespace std;
struct point
{
int x,y,z;
} p[205];
ll line(point a,point 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);
}
int sfgm(point d,point a,point b,point c)//四点是否共面
{
int s[4][4];
s[1][1]=d.x-a.x;
s[1][2]=d.y-a.y;
s[1][3]=d.z-a.z;
s[2][1]=d.x-b.x;
s[2][2]=d.y-b.y;
s[2][3]=d.z-b.z;
s[3][1]=d.x-c.x;
s[3][2]=d.y-c.y;
s[3][3]=d.z-c.z;
ll res1,res2;
res1=s[1][1]*s[2][2]*s[3][3]+s[1][2]*s[2][3]*s[3][1]+s[1][3]*s[2][1]*s[3][2];
res2=s[1][3]*s[2][2]*s[3][1]+s[2][3]*s[3][2]*s[1][1]+s[3][3]*s[1][2]*s[2][1];
if(res1==res2)
return 1;
return 0;
}
int main()
{
int t;
cin>>t;
for(int k=1; k<=t; k++)
{
int n;
cin>>n;
for(int i=0; i<n; i++)
cin>>p[i].x>>p[i].y>>p[i].z;
ll ans1=0,ans2=0;
for(int i1=0; i1<n; i1++)
{
for(int i2=i1+1; i2<n; i2++)
{
int cut=0;
int flag[205];
memset(flag,0,sizeof(flag));
for(int i3=0; i3<n; i3++)
{
if(i3==i2||i3==i1)
continue;
if(line(p[i1],p[i3])==line(p[i2],p[i3]))
flag[cut++]=i3;
}
if(cut<=1)
continue;
for(int i3=0; i3<cut; i3++)
{
for(int i4=i3+1; i4<cut; i4++)
{
if(line(p[i1],p[flag[i3]])!=line(p[i1],p[flag[i4]]))
continue;
if(sfgm(p[i1],p[i2],p[flag[i3]],p[flag[i4]]))
continue;
if(line(p[i1],p[i2])==line(p[flag[i3]],p[flag[i4]])&&line(p[i1],p[i2])==line(p[i1],p[flag[i3]]))
ans1++;
else
ans2++;
}
}
}
}
printf("Case #%lld: %lld\n",k,ans1/6+ans2/2);
}
return 0;
}
hdu 5839
题目大体就是说
给你一对点找到符合以下要求的四面体
1.至少四条边相等(换句话说可以5条边或者6条边)
2.如果只有四条边相等那么不相等的两个边为对边
直接暴力
先用两个循环,枚举两个点,然后找到这两个点距离相等的点,放入一个数组。
然后在这个数组中,找两个符合条件的点。
注意每个正四面体算了四次,其余符合要求的算了两次。
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define mod 1000000007
#define maxn 10000005
#define ll long long
#define PI acos(-1)
using namespace std;
struct point
{
int x,y,z;
} p[205];
ll line(point a,point 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);
}
int sfgm(point d,point a,point b,point c)//四点是否共面
{
int s[4][4];
s[1][1]=d.x-a.x;
s[1][2]=d.y-a.y;
s[1][3]=d.z-a.z;
s[2][1]=d.x-b.x;
s[2][2]=d.y-b.y;
s[2][3]=d.z-b.z;
s[3][1]=d.x-c.x;
s[3][2]=d.y-c.y;
s[3][3]=d.z-c.z;
ll res1,res2;
res1=s[1][1]*s[2][2]*s[3][3]+s[1][2]*s[2][3]*s[3][1]+s[1][3]*s[2][1]*s[3][2];
res2=s[1][3]*s[2][2]*s[3][1]+s[2][3]*s[3][2]*s[1][1]+s[3][3]*s[1][2]*s[2][1];
if(res1==res2)
return 1;
return 0;
}
int main()
{
int t;
cin>>t;
for(int k=1; k<=t; k++)
{
int n;
cin>>n;
for(int i=0; i<n; i++)
cin>>p[i].x>>p[i].y>>p[i].z;
ll ans1=0,ans2=0;
for(int i1=0; i1<n; i1++)
{
for(int i2=i1+1; i2<n; i2++)
{
int cut=0;
int flag[205];
memset(flag,0,sizeof(flag));
for(int i3=0; i3<n; i3++)
{
if(i3==i2||i3==i1)
continue;
if(line(p[i1],p[i3])==line(p[i2],p[i3]))
flag[cut++]=i3;
}
if(cut<=1)
continue;
for(int i3=0; i3<cut; i3++)
{
for(int i4=i3+1; i4<cut; i4++)
{
if(line(p[i1],p[flag[i3]])!=line(p[i1],p[flag[i4]]))
continue;
if(sfgm(p[i1],p[i2],p[flag[i3]],p[flag[i4]]))
continue;
if(line(p[i1],p[i2])==line(p[flag[i3]],p[flag[i4]])&&line(p[i1],p[i2])==line(p[i1],p[flag[i3]]))
ans1++;
else
ans2++;
}
}
}
}
printf("Case #%lld: %lld\n",k,ans1/6+ans2/2);
}
return 0;
}