POJ 2002 Squares
2015-12-21 23:35
381 查看
之前没怎么做过这种几何的题目,这次通过这道题也是知道了一些简单的做几何题目的思考方向,本题就是在一大堆点中找正方形,值得注意的是正方形有可能是斜着的= =
大体思路是对点进行枚举,先按照横纵坐标从小到大的顺序排序,然后对点进行两两配对,以配对的两个点为基准,找另外两个点在不在我们的点集里面。
现在的问题就在于如何确定另外两个点在哪里,画一个草图以后我们可以看到已知两个点,确定一个正方形有两种可能,但是因为我们预先排了序,所以我们只需要考虑一种方向就可以了,利用简单的全等三角形就可以求出来两个点的坐标
大体思路是对点进行枚举,先按照横纵坐标从小到大的顺序排序,然后对点进行两两配对,以配对的两个点为基准,找另外两个点在不在我们的点集里面。
现在的问题就在于如何确定另外两个点在哪里,画一个草图以后我们可以看到已知两个点,确定一个正方形有两种可能,但是因为我们预先排了序,所以我们只需要考虑一种方向就可以了,利用简单的全等三角形就可以求出来两个点的坐标
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> using namespace std; #define maxn 1050 struct data{ int x,y; }; data p[maxn]={0}; bool cmp(const data &a,const data &b){ if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int main(){ int n; while(scanf("%d",&n),n){ memset(p,0,sizeof(p)); for(int i=0;i<n;++i){ scanf("%d%d",&p[i].x,&p[i].y); } sort(p,p+n,cmp); int ans = 0; for(int i=0;i<n;++i){ for(int j=i+1;j<n;++j){ data tmp; tmp.x = p[i].x + p[i].y - p[j].y; tmp.y = p[i].y - p[i].x + p[j].x; if(!binary_search(p, p + n, tmp, cmp)) continue; tmp.x = p[j].x + p[i].y - p[j].y; tmp.y = p[j].y - p[i].x + p[j].x; if(!binary_search(p, p + n, tmp, cmp)) continue; ans ++; } } printf("%d\n",ans/2); } //system("pause"); return 0; }
相关文章推荐
- android源码分析之大字体
- RHadoop和CDH整合实例(三)- RHive
- android单选按钮选择,RadioGroup,radioButton
- 如何自动在Eclipse里对指定类或接口生成要覆盖的方法?
- leetcode -- Missing Number -- 位运算重点
- contentProvider内容提供者
- 客户端技术:Cookie 服务端技术:HttpSession
- “命令行程序”的通用图形界面 (转)
- IOS TableViewCell分割线设置和隐藏多余cell
- 电脑不能上网的原因
- 设置UILabel的行间距
- CSS浮动(float,clear)通俗讲解
- java中构造方法和方法super/this超类与子类中初始化顺序
- 谢尔宾斯基三角垫
- 数据库对象和约束
- 读书笔记(二)
- jQuery Moblile Demos学习记录Theming、Button、Icons图标,脑子真的不好使。
- 成为一名优秀的Developer的书单
- win7下利用iis搭建web服务器实现信息浏览资源共享
- 【Leetcode】Bulb Switcher