【计算几何】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学长虽然并不打炉石传说,但是由于题面需要他便学会了打炉石传说.但是传统的炉石 ...
随机推荐
- 对js 面对对象编程的一些简单的理解
由简单开始深入: 最简单的 直接对象开始 var desen = { age:24, name:'xyf', job:'fontEnd', getName:function(){ console.lo ...
- Scala 学习记录(一)
1. 相对于java,scala的值修饰用val,变量修饰用var.值相当于java的final 修饰了. package demo object ScalaBase extends App { pr ...
- java中同步(synchronized)详解
一.开山篇: 1.synchronized的使用 一个程序中,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简 ...
- 给Sublime Text3 设置自定义快捷键
Preferrences -> Key Bindings-User打开用户自定义快捷键文件,添加以下代码,保存. [ { "keys": ["ctrl+shift+ ...
- 保密安全风险自评估单机版检查工具V1.0
下载链接:http://download.csdn.net/download/moremoretea1983/10273128
- shell 数值比较和字符串比较
1. 数值比较 -eq 是否相等(equal) -gt 是否大于(greater than) -ge 是否大于等于(greater and equal tha ...
- OpenCV2:第九章 图像比较
一.简介 图像相似度主要是对两幅图像内容的相似程度进行打分,根据分数的高低来判断图像内容的相似程度. 常见的图像比较有两种方法:峰值信噪比PSNR和结构相似性SSIM 二.峰值信噪比PSNR(Peak ...
- p1036 选数(不详细勿看,递归)
题目:传送门 这题,不会做,而且看了好久才看懂题解的,然后在题解的基础上补了一个 if(start>end) return 0 感觉这样对于我更直观 转载自:大神博客的传送门,点击进入 先声明, ...
- 关闭 macOS Google Chrome 黑暗模式风格
终端执行命令 defaults write com.google.Chrome NSRequiresAquaSystemAppearance -bool YES 恢复 defaults write c ...
- running Fluent on Apocrita Cluster
two files: code.sh, code.jou code.sh #!/bin/bash #$ -cwd #$ -j y #$ -m bea #$ -M k.ai@qmul.ac.uk #$ ...