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;
}
时间: 2024-10-21 06:23:41

ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)的相关文章

POJ 3668 Game of Lines (暴力,判重)

题意:给定 n 个点,每个点都可以和另一个点相连,问你共有多少种不同斜率的直线. 析:那就直接暴力好了,反正数也不大,用set判重就好,注意斜率不存在的情况. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #

886A. ACM ICPC#均值分配问题(暴力)

题目出处:http://codeforces.com/problemset/problem/886/A 题目大意:已知六个人得分,问是否能分成两个三人队使得每个队伍得分加和相等 #include<stdio.h> //从六个数中选出三个不重复的数字加和,如果这个和正好为总数的一半即可 int main() { int a[6]; int i,j,k,sum=0,s; for(i=0;i<6;i++) { scanf("%d",&a[i]); sum+=a[i]

ACM/ICPC 之 枚举(POJ1681-画家问题+POJ1166-拨钟问题)

POJ1681-画家问题 枚举的经典例题,枚举第一行即可,其余行唯一. 1 //画家问题,y表示黄色,w表示白色,怎样让墙上所有方格为y,操作类似熄灯问题poj1222 2 //memory 136K Time: 297 Ms 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 9 #define INF

[ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)

Generalized Palindromic Number Time Limit: 2 Seconds      Memory Limit: 65536 KB A number that will be the same when it is written forwards or backwards is known as a palindromic number. For example, 1234321 is a palindromic number. We call a number 

【题解】 2015 ACM/ICPC Asia Regional Shenyang Online

[1006] FangFang (暴力枚举) Fang Fang Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 871    Accepted Submission(s): 364 Problem Description Fang Fang says she wants to be remembered. I promise her.

ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L

这套题是我上周日, 就是前天打得一场组队赛, 题目不太好找 题目链接:http://codeforces.com/gym/100861 在virtual judge 上也可以提交哦! A ACM ICPC Rules: 题目大意: 有很多所高校参加预选赛, 并在预选赛取得了排名, 但是对于每所学校, 除了MSU有4个名额之外其他大学只有两个名额( 也就是说, 只有每个大学的前2名进决赛(MSU前四名)&& 最多有10个队伍进入决赛), 高中队伍不能进入决赛. 给出预选赛的排名, 输出可以进

HDU 5024 Wang Xifeng&#39;s Little Plot(暴力枚举+瞎搞)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5024 Problem Description <Dream of the Red Chamber>(also <The Story of the Stone>) is one of the Four Great Classical Novels of Chinese literature, and it is commonly regarded as the best one. Thi

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

hdu 5247 找连续数【暴力枚举】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 分析:这道题是2015百度之星初赛1的2题,当时没看这道题 是队友看的,比完以后也做了一下,思路大体都是一样的,就是 暴力枚举,因为k<=1000,那么我们可以每一点x为起点跑[x,x+999] 这段区间,把每得到一段连续的子区间[x,?],则num[len]++(len=size([x,?])); 这样就可以了,最后num数组里就是对应的答案 献上代码: #include<stdio.h&