HDU 5839 Special Tetrahedron (计算几何)
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
Source
2016中国大学生程序设计竞赛 - 网络选拔赛
##题意:
在三维空间中给出N个点,找有多少个满足条件的四面体.
1. 四面体至少有四条边相等
2. 若恰好四条边相等,那么剩下的两边不相邻.
##题解:
四面体中每条边仅有一条边与它不相邻, 可以转化一下题目的条件:
寻找四边相等的空间四边形(不能四点共面).
首先枚举该空间四边形中的一条对角线,再计算剩余的点跟这条对角线两端点的距离.
若某点与这对角线两端点的距离相等, 则添加到一个集合中.
枚举集合中的任意两点,与对角线两端点组成一个四边形. 判断该四边形是否符合条件:
首先集合中两点到对角线端点的距离要相等. 其次,这四点要不共面.
在上述判断过程中会出现重复计数:
由于每个四边形有两条对角线,所以在枚举对角形计数时,每个四边形都被计数了两次.
特殊的:如果一个四面体是正四面体,那么这四个点被计数了6次. (每条边都计数一次)
所以在处理过程中要记录出现了几次正四面体.
每当枚举到一个合法的空间四面体时,求一下剩下两条边是否跟其它边相等. 如果相等则计数.
令rep为上述计数次数, rep/6 为正四面体的个数(每个正四面体会计数6次).
根据上述分析, ans/2 - 2*rep/6 即为最后结果.
关于时间复杂度:
上述过程看起来是 O(N^4).
而实际上,每次枚举对角线时,符合条件的点一定在这条对角线的中垂面上.
所以不可能每次枚举对角线时,都有很多点在中垂面上. 所以均摊复杂度并不高.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define double long long
#define eps 1e-8
#define maxn 1010
#define mod 1000000007
#define inf 0x3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std;
int n;
struct Point{
double x,y,z;
Point(){}
Point(double tx,double ty) {x=tx;y=ty;}
}p[220];
double Distance(Point p1,Point p2)
{
return ((p1.x-p2.x)(p1.x-p2.x)+(p1.y-p2.y)(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z));
}
Point xmul(Point u, Point v) {
Point ret;
ret.x = u.yv.z - v.yu.z;
ret.y = u.zv.x - u.xv.z;
ret.z = u.xv.y - u.yv.x;
return ret;
}
LL dmul(Point u, Point v) {
return u.xv.x + u.yv.y + u.z*v.z;
}
Point subt(Point u, Point v) {
Point ret;
ret.x = u.x - v.x;
ret.y = u.y - v.y;
ret.z = u.z - v.z;
return ret;
}
/求平面的垂向量/
Point pvec(Point s1, Point s2, Point s3) {
return xmul(subt(s1,s2),subt(s2,s3));
}
/判断四点共面/
bool is_ok(Point a, Point b, Point c, Point d) {
return (dmul(pvec(a,b,c),subt(d,a))) == 0LL;
}
struct node {
int id;
LL dis;
node(){}
node(int tx,LL ty) {id=tx;dis=ty;}
};
vector q;
int main(int argc, char const *argv[])
{
//IN;
int t, ca=1; cin >> t;
while(t--)
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%lld %lld %lld", &p[i].x, &p[i].y, &p[i].z);
int ans = 0;
int rep = 0;
for(int i=1; i<=n; i++) {
for(int j=i+1; j<=n; j++) { /*枚举对角线*/
q.clear();
for(int k=1; k<=n; k++) {
if(Distance(p[k],p[i]) == Distance(p[k],p[j])) {
q.push_back(node(k, Distance(p[k],p[j])));
}
}
int sz = q.size();
for(int ii=0; ii<sz; ii++) {
for(int jj=ii+1; jj<sz; jj++) {
if(q[ii].dis != q[jj].dis) continue;
if(is_ok(p[i],p[j],p[q[ii].id],p[q[jj].id])) continue; /*四点共面*/
ans++;
/*是否是正四面体*/
if(Distance(p[i],p[j])==q[ii].dis && q[ii].dis==Distance(p[q[ii].id],p[q[jj].id]))
rep++;
}
}
}
}
ans /= 2;
ans -= 2*rep/6;
printf("Case #%d: %d\n", ca++, ans);
}
return 0;
}
HDU 5839 Special Tetrahedron (计算几何)的更多相关文章
- HDU 5839 Special Tetrahedron 计算几何
Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
- HDU 5839 Special Tetrahedron
HDU 5839 Special Tetrahedron 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n ...
- HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不 ...
- HDU 5130 Signal Interference(计算几何 + 模板)
HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...
- (四面体)CCPC网络赛 HDU5839 Special Tetrahedron
CCPC网络赛 HDU5839 Special Tetrahedron 题意:n个点,选四个出来组成四面体,要符合四面体至少四条边相等,若四条边相等则剩下两条边不相邻,求个数 思路:枚举四面体上一条线 ...
- hdu 5839(三维几何)
Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 【HDU 5839】Special Tetrahedron(计算几何)
空间的200个点,求出至少四边相等,且其余两边必须不相邻的四面体的个数. 用map记录距离点i为d的点有几个,这样来优化暴力的四重循环. 别人的做法是枚举两点的中垂面上的点,再把到中点距离相等的点找出 ...
- HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)
Convex Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- hive 学习笔记——表的入门操作和命令
1.受控表(managed table)包括内部表.分区表.桶表: 1.1.分区表 创建分区表: create table banji(id INT,name STRING) partitioned ...
- HDU 4549 M斐波那契数列(矩阵幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4549 题意:F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]. 思路:手算一下可以发现 ...
- 函数buf_LRU_add_block
/******************************************************************//** Adds a block to the LRU list ...
- SQL2008 R2 主从数据库同步设置
一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2 DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...
- asp.net 使用JQuery 调用Ashx 后面直接写方法名,通过反射找到对应的方法
using System.Reflection; public class Industry_Manager : IHttpHandler { HttpRequest gRequest = null; ...
- eval绑定decimal数据后,如何去掉后面没有意义的0?
假如有个数字是 25.00 就应该只显示 25 ,而如果是25.3 则还是显示 25.3 Score.ToString("g0") 这样就可以去掉 decimal 后面多 ...
- Android中ListView嵌套进ScrollView时高度很小的解决方案
package com.example.test.util; import android.view.View; import android.view.ViewGroup; import andro ...
- Log4NET简介
log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 前提 最近做项目需要记录系统日志和用 ...
- C#中使用visio控件
C#中使用visio控件 2012-08-25 18:14:19| 分类: 技术相关|举报|字号 订阅 其实就是C#访问VISIO的自动化模型,以前做了不少C#和Excle及word 的交互 ...
- ASP.NET MVC+Bootstrap个人博客之praise.js点赞特效插件(二)
1. 为啥要做这个点赞插件? praise.js是一款小巧的jQuery点赞插件,使用简便,效果美观. 在做个人博客时遇到了文章点赞问题.联想到各大社交网络中的点赞特效:手势放大.红心放大等等, ...