ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)
CCPC网赛第八题,求立体几何数量,题解见注释
//立体几何-求满足要求的四面体个数
//要求1:至少4条边相等
//要求2:四条边相等时,另两条边一定不相邻(即对边)
//题解:以当前边为不相邻的其中一条边,对可以构成等腰三角形的第三点进行枚举
//再对这些第三点的集合做一次n^2的枚举,分两种情况找出四面体
//如果四条边或五条边相同,则只存在两种重复情况(当前边和对边互换)
//如果六条边相同,则存在六种重复情况(每个边作一次当前边)
//Time:499Ms Memory:1576K
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define MAXP 205
#define POW(x) ((x)*(x)) struct Point{
int x, y, z;
Point() {}
Point(int xx, int yy, int zz):x(xx), y(yy), z(zz){}
}p[MAXP]; struct Node {
int d, u;
Node(){}
Node(int dd, int uu):d(dd), u(uu){}
}nd[MAXP]; int n;
int len; int Distance(Point a, Point b)
{
return POW(a.x - b.x) + POW(a.y - b.y) + POW(a.z - b.z);
} Point xmult(Point a, Point b) //叉积
{
return Point(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x);
}
//向量差a-b(b到a)
Point subt(Point a, Point b)
{
return Point(a.x - b.x, a.y - b.y, a.z - b.z);
} int dmult(Point a, Point b) //点积
{
return a.x*b.x + a.y*b.y + a.z*b.z;
} //取平面法向量
Point normalv(Point a, Point b, Point c)
{
return xmult(subt(a, b), subt(b, c));
} bool onplane(Point a, Point b, Point c, Point d) //四点共面
{
return dmult(normalv(a, b, c), subt(d, a)) == 0;
} int main()
{
//freopen("t.in", "r", stdin);
int T;
int cas = 1;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].z);
int sum1 = 0, sum2 = 0; //sum1:六条边不全相等,sum2:六条边都相等
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
len = 0;
for (int k = 0; k < n; k++) //枚举到ij线段上距离相等的第三点k
{
if (k == i || k == j) continue;
int tmp = Distance(p[i], p[k]);
if (tmp == Distance(p[j], p[k]))
nd[len++] = Node(tmp, k);
} for (int k1 = 0; k1 < len; k1++)
{
for (int k2 = k1 + 1; k2 < len; k2++)
{
if (nd[k1].d != nd[k2].d) continue;
if (onplane(p[i], p[j], p[nd[k1].u], p[nd[k2].u])) continue;
int tmp = Distance(p[nd[k1].u], p[nd[k2].u]);
if (tmp == Distance(p[i], p[j]) && tmp == nd[k1].d)
sum2++; //六条边相等
else sum1++;
}
} }
}
printf("Case #%d: %d\n", cas++, sum1/2+sum2/6);
} return 0;
}
ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)的更多相关文章
- POJ 3668 Game of Lines (暴力,判重)
题意:给定 n 个点,每个点都可以和另一个点相连,问你共有多少种不同斜率的直线. 析:那就直接暴力好了,反正数也不大,用set判重就好,注意斜率不存在的情况. 代码如下: #include <c ...
- 886A. ACM ICPC#均值分配问题(暴力)
题目出处:http://codeforces.com/problemset/problem/886/A 题目大意:已知六个人得分,问是否能分成两个三人队使得每个队伍得分加和相等 #include< ...
- Codeforces Round #445 A. ACM ICPC【暴力】
A. ACM ICPC time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- HDU 6351暴力枚举 6354计算几何
Beautiful Now Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题+POJ1054-讨厌的青蛙)
POJ1681-画家问题 枚举的经典例题,枚举第一行即可,其余行唯一. //画家问题,y表示黄色,w表示白色,怎样让墙上所有方格为y,操作类似熄灯问题poj1222 //memory 136K Tim ...
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
Generalized Palindromic Number Time Limit: 2 Seconds Memory Limit: 65536 KB A number that will ...
- Codeforces 890A - ACM ICPC 暴力
A. ACM ICPCtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputst ...
- hdu 4277 USACO ORZ (暴力+set容器判重)
USACO ORZ Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
随机推荐
- 用vue.js学习es6(三):数组、对象和函数的解构
一.数组的解构: 以前的方式: var arr = [1,2,3]; console.log(arr[0]); //1 console.log(arr[1]); //2 现在的方式: var [a,b ...
- [转]extjs组件添加事件监听的三种方式
原文地址:http://blog.csdn.net/y6300023290/article/details/18989635 1.在定义组件配置的时候设置 xtype : 'textarea', na ...
- curl的登录总结
demo1 <?php $curl=curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?> c ...
- 利用django创建一个投票网站(一)
这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...
- Chrome 开发工具之Network
经常会听到比如"为什么我的js代码没执行啊?","我明明发送了请求,为什么反应?","我这个网站怎么加载的这么慢?"这类的问题,那么问题既然 ...
- python应用案例
安装库 : PIL(Image.ImageDraw.ImageFont.zlib).jpeg 常见问题 (1) Could not find a version that satisfies the ...
- js正则表达式(1)
定义正则: var reg = new RegExp('a'); //实例化对象,参数是我们想要制定的规var reg = /a/; //简写方法 正则的常用方法: 1.test():在字符串中查找符 ...
- Python Day11
RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...
- 【转】windows环境下安装win8.1+Mac OS X 10.10双系统教程
先要感谢远景论坛里的各位大神们的帖子 没有他们的分享我也不能顺利的装上Mac OS X 10.10! 写这篇随笔主要是为了防止自己遗忘,同时给大家分享下我的经验. 本教程适用于BIOS+MBR分区的 ...
- 测试数组push和unshift方法的效率
先贴代码,之后再来补内容 <!DOCTYPE HTML> <html> <head> <title>测试数组push和unshift方法的效率</ ...