【计算几何】FZU Problem 2270 Two Triangles
http://acm.fzu.edu.cn/problem.php?pid=2270
【题意】
给定6到10个点,从中选出6个不同的点组成两个三角形,使其中一个三角形可以通过另一个三角形平移和旋转得到。问有多少种不同的三角形选法?
【思路】
- 全等
- 排除对称
【Accepted】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std; int n;
const double eps=1e-;
struct Point
{
int x;
int y;
Point(){}
Point(int _x,int _y):x(_x),y(_y){}
Point operator-(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
int operator^(const Point &b)const
{
return x*b.y-y*b.x;
}
int operator*(const Point &b)const
{
return x*b.x+y*b.y;
}
}p[];
bool v[][][][][][];
int dist(int i,int j)
{
return (p[i]-p[j])*(p[i]-p[j]);
}
int dis[][];
bool judge(int i,int j,int k)
{
double x=sqrt(dist(i,j));
double y=sqrt(dist(i,k));
double z=sqrt(dist(j,k));
double a[]={x,y,z};
sort(a,a+);
if(fabs(a[]+a[]-a[])<=eps)
{
return false;
}
return true;
} bool check(int i,int j,int k,int l,int m,int o,int flag)
{
int a[]={i,k,m};
int b[]={j,l,o};
sort(a,a+);
sort(b,b+);
if(v[a[]][a[]][a[]][b[]][b[]][b[]])
{
return true;
}
if(flag)
{
v[a[]][a[]][a[]][b[]][b[]][b[]]=;
}
return false;
} bool rt(int i,int j,int k,int l,int m,int o)
{
if(((p[k]-p[i])^(p[m]-p[k]))*((p[l]-p[j])^(p[o]-p[l]))<)//叉积的乘积大于等于0代表方向是一样的,如果方向不一样,说明是对称的
{
return false;
}
if(((p[m]-p[k])^(p[i]-p[m]))*((p[o]-p[l])^(p[j]-p[o]))<)
{
return false;
}
if(((p[i]-p[m])^(p[k]-p[i]))*((p[j]-p[o])^(p[l]-p[j]))<)
{
return false;
}
return true;
}
int main()
{
int T;
scanf("%d",&T);
int cas=;
while(T--)
{
//这个数组用来去重,一定要初始化
memset(v,,sizeof(v));
int ans=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(j==i) continue;
for(int k=;k<=n;k++)
{
if(k==i||k==j) continue;
for(int l=;l<=n;l++)
{
if(l==i||l==j||l==k) continue;
if(dist(i,k)!=dist(j,l)) continue;
//目前为止已经选出两个三角形对应相等的两条边ik和jl
for(int m=;m<=n;m++)
{
if(m==i||m==j||m==k||m==l) continue;
//先选出m点,排除三点共线的情况
if(!judge(i,k,m)) continue;
for(int o=;o<=n;o++)
{
if(o==i||o==j||o==k||o==l||o==m) continue;
if(dist(k,m)!=dist(l,o)||dist(m,i)!=dist(o,j)) continue;
//现在已经选出两个全等的三角形
if(check(i,j,k,l,m,o,)) continue;
//去重,如果是重复的重新选择
if(rt(i,j,k,l,m,o))//因为只能是平移和旋转得到,所以要排除对称这种情况
{
ans++;
check(i,j,k,l,m,o,);//把这种选择标记为1
}
}
}
}
}
}
}
printf("Case %d: %d\n",++cas,ans);
}
return ;
}
【计算几何】FZU Problem 2270 Two Triangles的更多相关文章
- FZu Problem 2233 ~APTX4869 (并查集 + sort)
题目链接: FZu Problem 2233 ~APTX4869 题目描述: 给一个n*n的矩阵,(i, j)表示第 i 种材料 和 第 j 种材料的影响值,这个矩阵代表这n个物品之间的影响值.当把这 ...
- FZu Problem 2236 第十四个目标 (线段树 + dp)
题目链接: FZu Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...
- 翻翻棋(找规律问题)(FZU Problem 2230)
题目是这样的: FZU Problem 2230 象棋翻翻棋(暗棋)中双方在4*8的格子中交战,有时候最后会只剩下帅和将.根据暗棋的规则,棋子只能上下左右移动,且相同的级别下,主动移动到地方棋子方将吃 ...
- fzu Problem 2148 Moon Game(几何 凸四多边形 叉积)
题目:http://acm.fzu.edu.cn/problem.php?pid=2148 题意:给出n个点,判断可以组成多少个凸四边形. 思路: 因为n很小,所以直接暴力,判断是否为凸四边形的方法是 ...
- fzu Problem 2140 Forever 0.5(推理构造)
题目:http://acm.fzu.edu.cn/problem.php?pid=2140 题意: 题目大意:给出n,要求找出n个点,满足: 1)任意两点间的距离不超过1: 2)每个点与(0,0)点的 ...
- Fzu Problem 2082 过路费 LCT,动态树
题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528 Submit: 1654Time Limit ...
- FZU Problem 2169 shadow
http://acm.fzu.edu.cn/problem.php?pid=2169 题目大意: S王国有N个城市,有N-1条道路.王都为编号1的城市.叛军驻扎在很多城市.除了王都外有K个城市有军队, ...
- fzu Problem 2128 最长子串(KMP + strstr 经典好题)
Problem Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长. Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10 ...
- fzu Problem - 2232 炉石传说(二分匹配)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2232 Description GG学长虽然并不打炉石传说,但是由于题面需要他便学会了打炉石传说.但是传统的炉石 ...
随机推荐
- html引入另一个html
在写页面的时候,有些东西是一样的,比如头部的导航或者尾部的标注.所以复用的东西可以写到一个文件中,之后再引入,angularjs或是jsp中都有很好的标签引入,而html没有,但是可以借助一些方式进行 ...
- JVM初探
### JVM分为类的加载生命周期和gc垃圾回收两个大的方面#####首先是类的生命周期, 类的加载: --> 记载字节码 ---> 这个过程有类的加载起参与,双亲委托机制() --> ...
- 全志R58平台的GPIO引脚控制
全志R58平台的GPIO引脚控制 2017/8/18 15:50 版本:V1.0 开发板:SC5806(全志R58平台) SDK:android4.4.4 本文以GPIO引脚PD24为例,在开发板的背 ...
- 在colab上运行style-transfer
1, 打开chrome浏览器,输入以下网址,打开风格转换主文件 https://colab.research.google.com/github/Hvass-Labs/TensorFlow-Tuto ...
- AJAX中文乱码解决方案
通过AJAX获取数据中文乱码解决方案: @ResponseBody 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到 ...
- iOS UI异步更新:dispatch_async 与 dispatch_get_global_queue 的使用方法
GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...
- iOS 获取真机上系统动态库文件
iOS 获取真机上所有系统库文件 系统动态库文件存放真机地址(/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64) 在Mac\i ...
- EJB 使用多个数据源问题
编辑 删除 如果在JBoss中同时使用俩个数据源就会发生如下异常: Transaction is not active: tx=TransactionImple < ac, BasicActio ...
- centos7环境搭建Eureka-Server注册中心集群
目的:测试和线上使用这套独立的Eureka-Server注册中心集群,目前3台虚拟机集群,后续可直接修改配置文件进行新增或减少集群机器. 系统环境: Centos7x64 java8+(JDK1.8+ ...
- easyui前端框架01
一. 三大前端框架的特点 1.easyui=jquery+html4 优点:快速开发.功能齐全 .免费 缺点:不好看.不支持相应式开发 2.bootstrap=jquery+html5 优点: 功能强 ...