Special Tetrahedron

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5839

Description

Given n points which are in three-dimensional space(without repetition).

Please find out how many distinct Special Tetrahedron among them. A tetrahedron is called Special Tetrahedron if it has two following characters.

  1. At least four edges have the same length.

  2. If it has exactly four edges of the same length, the other two edges are not adjacent.

Input

Intput contains multiple test cases.

The first line is an integer T,1≤T≤20, the number of test cases.

Each case begins with an integer n(n≤200), indicating the number of the points.

The next n lines contains three integers xi,yi,zi, (−2000≤xi,yi,zi≤2000), representing the coordinates of the ith point.

Output

For each test case,output a line which contains"Case #x: y",x represents the xth test(starting from one),y is the number of Special Tetrahedron.

Sample Input

2

4

0 0 0

0 1 1

1 0 1

1 1 0

9

0 0 0

0 0 2

1 1 1

-1 -1 1

1 -1 1

-1 1 1

1 1 0

1 0 1

0 1 1

Sample Output

Case #1: 1

Case #2: 6

Hint

题意

给你三维一些点,问你有多少个四边形满足以下条件

1.至少四个边相同

2.如果四个边相同,那么不相同的两个边不在一起。

题解:

n4暴力,但实际上复杂度达不到n4【和出题人是否懒惰有关,233

暴力枚举两个点,然后再枚举离这两点距离相同的点。

再枚举四个点,找到这个四边形四边相同,但是不共面的四个点。

再判断这个是不是正四边形,如果是正四边形的话,你会重复计算6次

否则重复计算两次。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 205;
struct point
{
int x,y,z;
point(){}
point(int x_,int y_,int z_):x(x_),y(y_),z(z_) {}
}p[210];
long long sq(long long a){
return a*a;
}
long long dis(point a,point b){
return sq(a.x-b.x)+sq(a.y-b.y)+sq(a.z-b.z);
}
bool check(point a,point b,point c,point d)
{
point s1,s2,s3;
s1.x=b.x-a.x;s1.y=b.y-a.y;s1.z=b.z-a.z;
s2.x=c.x-a.x;s2.y=c.y-a.y;s2.z=c.z-a.z;
s3.x=d.x-a.x;s3.y=d.y-a.y;s3.z=d.z-a.z;
long long ans=s1.x*s2.y*s3.z+s1.y*s2.z*s3.x+s1.z*s2.x*s3.y-s1.z*s2.y*s3.x-s1.x*s2.z*s3.y-s1.y*s2.x*s3.z;
if(ans==0)return true;
return false;
}
int Q[300],cas;
void solve(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
}
long long ans1=0,ans2=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
int cnt=0;
for(int k=1;k<=n;k++)
{
if(k==i||k==j)continue;
if(dis(p[i],p[k])==dis(p[j],p[k]))
Q[cnt++]=k;
}
if(cnt<=1)continue;
for(int i1=0;i1<cnt;i1++)
{
for(int j1=i1+1;j1<cnt;j1++)
{
int id1=Q[i1],id2=Q[j1];
if(dis(p[id1],p[i])!=dis(p[id2],p[i]))continue;
if(check(p[i],p[j],p[id1],p[id2]))continue;
if(dis(p[i],p[j])==dis(p[id1],p[i])&&dis(p[i],p[j])==dis(p[id1],p[id2]))ans2++;
else ans1++;
}
}
}
}
printf("Case #%d: %d\n",++cas,ans1/2+ans2/6);
}
int main(){
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}

HDU 5839 Special Tetrahedron 计算几何的更多相关文章

  1. HDU 5839 Special Tetrahedron

    HDU 5839 Special Tetrahedron 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n ...

  2. HDU 5839 Special Tetrahedron (计算几何)

    Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

  3. HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不 ...

  4. HDU 5130 Signal Interference(计算几何 + 模板)

    HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...

  5. (四面体)CCPC网络赛 HDU5839 Special Tetrahedron

    CCPC网络赛 HDU5839 Special Tetrahedron 题意:n个点,选四个出来组成四面体,要符合四面体至少四条边相等,若四条边相等则剩下两条边不相邻,求个数 思路:枚举四面体上一条线 ...

  6. hdu 5839(三维几何)

    Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  7. 【HDU 5839】Special Tetrahedron(计算几何)

    空间的200个点,求出至少四边相等,且其余两边必须不相邻的四面体的个数. 用map记录距离点i为d的点有几个,这样来优化暴力的四重循环. 别人的做法是枚举两点的中垂面上的点,再把到中点距离相等的点找出 ...

  8. HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)

    Convex Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. git与代码托管工具

    1.git初识 git是一个版本管理工具,用来管理项目的不同的版本,记录下不同的提交记录,git还可以构建不同的分支,用来给不同的人来推送使用. 推荐的git教程:https://www.cnblog ...

  2. 错误的理解引起的bug async await 执行顺序

    今天有幸好碰到一个bug,让我知道了之前我对await async 的理解有点偏差. 错误的理解 之前我一直以为  await 后面的表达式,如果是直接返回一个具体的值就不会等待,而是继续执行asyn ...

  3. 08 Go 1.8 Release Notes

    Go 1.8 Release Notes Introduction to Go 1.8 Changes to the language Ports Known Issues Tools Assembl ...

  4. python多个分割符split字符串

    python中string自带的split不支持多个分隔符同时切分,用正则 import re line='hello,world' lineLists = re.split('[,,..??]',l ...

  5. UFLDL 教程学习笔记(一)

    ufdl的新教程,从基础学起.第一节讲的是线性回归.主要目的是熟悉目标函数,计算梯度和优化. 按着教程写完代码后,总是编译出错,一查是mex的原因,实在不想整了. 这位博主用的是向量,比较简洁:htt ...

  6. java JVM指令2

    https://www.cnblogs.com/dreamroute/p/5089513.html 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送 ...

  7. java 异常使用指南

    应该在以下情况使用异常: 1.)在恰当的级别处理问题.(在知道如何处理的情况下才捕获异常) 2.)解决问题并且重新调用异常的方法 3.)进行少许的修补,然后绕过异常发生的地方继续执行 4.)用别的数据 ...

  8. SCU 4444: Travel(最短路)

    Travel The country frog lives in has n towns which are conveniently numbered by 1,2,…,n . Among n(n− ...

  9. nodejs查询数据库后,获取result结果集并赋值返回

    nodejs获取了查询结果,但不能返回出去, 情形如下: var query = function (path,id,param,sqlWhere,res){ var aa = 111;var sql ...

  10. app后端设计-- 数据库分表

    当项目上线后,随着用户的增长,有些数据表的规模会以几何级增长,当数据达到一定规模的时候(例如100万条),查询,读取性能就下降得很厉害,这时,我们就要考虑分表. 更新表数据时会导致索引更新,当单表数据 ...