标签:close tin src line oid scanf lap printf ||
HDU 5389 - Special Tetrahedron
题意:给定空间中 n个点(n<=100),求满足两个条件的特殊四面体的个数。条件1:至少4条边长度相同;条件2:如果只有4条边长度相同,则剩下两条边不能相邻。
思路:C(100, 4)不大,时限4s,暴力枚举即可。四个点不能共面,先求点积再叉积判断是否为0,即四面体体积不能为0。
TM我再次敲错了向量叉积函数cross。。。逐行debug才发现
#include<cstdio> #include<iostream> #include<cstring> using namespace std; struct P { int x, y, z; P(int xx=0, int yy=0, int zz=0):x(xx), y(yy), z(zz) {} P operator-(const P& a) { return P(x-a.x, y-a.y, z-a.z); } P operator*(const P& b) { return P(y*b.z-z*b.y, z*b.x-x*b.z, x*b.y-y*b.x); } int dis() { return x*x + y*y + z*z; } void print() { printf("(%d %d %d)\n", x, y, z); } }p[210]; int cross(const P& a, const P& b) { return a.x*b.x + a.y*b.y + a.z*b.z; } int main() { int cas=0, t; cin>>t; while(cas<t) { int n; scanf("%d", &n); for(int i=0;i<n;i++) { scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z); } int ans = 0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { for(int k=j+1;k<n;k++) { int dis1 = (p[i]-p[j]).dis(); int dis2 = (p[i]-p[k]).dis(); int dis3 = (p[j]-p[k]).dis(); if(dis1!=dis2 && dis2!=dis3 && dis1!=dis3) continue; int equa = -1; P t1, t2; if(dis1==dis2 && dis1!=dis3) equa = dis1, t1 = p[j], t2 = p[k]; if(dis1==dis3 && dis1!=dis2) equa = dis1, t1 = p[i], t2 = p[k]; if(dis2==dis3 && dis1!=dis2) equa = dis2, t1 = p[i], t2 = p[j]; // if(equa==-1) equa = dis1; for(int l=k+1;l<n;l++) { if(cross((p[i]-p[j])*(p[i]-p[k]), p[i]-p[l])==0) continue; if(equa!=-1) { if((p[l]-t1).dis()==equa && (p[l]-t2).dis()==equa) { ++ans; // printf("%d %d %d %d\n", i, j, k, l); } } else { // 底面三边相等 int dis4 = (p[l]-p[i]).dis(); int dis5 = (p[l]-p[j]).dis(); int dis6 = (p[l]-p[k]).dis(); if(dis4==dis1 && dis5==dis1 || dis4==dis1 && dis6==dis1 || dis5==dis1 && dis6==dis1) { ++ans; // printf("%d %d %d %d\n", i, j, k, l); } } } } } } printf("Case #%d: %d\n", ++cas, ans); } return 0; }
标签:close tin src line oid scanf lap printf ||
原文地址:https://www.cnblogs.com/izcat/p/11310824.html