poj2002Squares(点集组成正方形数)

链接

可以枚举两个点,因为是正方形两外两点可以由已知求出,据说可以根据三角形全等求出下列式子,数学渣不会证。。。

已知: (x1,y1)  (x2,y2)

则:   x3=x1+(y1-y2)   y3= y1-(x1-x2)

x4=x2+(y1-y2)   y4= y2-(x1-x2)

x3=x1-(y1-y2)   y3= y1+(x1-x2)

x4=x2-(y1-y2)   y4= y2+(x1-x2)

然后就可以hash或者二分做了,这里只用hash做的

应该算是简单的hash解决冲突的应用,放一个邻接表里。

两点需正反枚举两次,才能保证两种位置的正方形都被枚举到。

最后的结果需要除4,因为重复枚举了。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 1010
12 #define mod 99991
13 #define LL long long
14 #define INF 0xfffffff
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18 struct point
19 {
20     int x,y;
21     point(int x=0,int y=0):x(x),y(y){}
22 }p[N],o[N];
23 int next[N],head[mod],t;
24 void insert(int i)
25 {
26     int key = (p[i].x*p[i].x+p[i].y*p[i].y)%mod;
27     next[t] = head[key];
28     o[t].x = p[i].x;
29     o[t].y = p[i].y;
30     head[key] = t++;
31 }
32 int find(point a)
33 {
34     int  key = (a.x*a.x+a.y*a.y)%mod;
35     int i;
36     for(i = head[key] ; i!= -1 ; i = next[i])
37     {
38         if(o[i].x==a.x&&o[i].y == a.y) return 1;
39     }
40     return 0;
41 }
42 bool cmp(point a,point b)
43 {
44     if(a.x==b.x)
45     return a.y<b.y;
46     return a.x<b.x;
47 }
48 int main()
49 {
50     int n,i,j;
51     while(scanf("%d",&n)&&n)
52     {
53         memset(head,-1,sizeof(head));
54         t = 0;
55         for(i = 1; i <= n; i++)
56         {
57             scanf("%d%d",&p[i].x,&p[i].y);
58             insert(i);
59         }
60         //sort(p+1,p+n+1,cmp);
61         int ans = 0;
62         for(i = 1; i <= n ;i++)
63             for(j = 1 ; j <= n; j++)
64             {
65                 if(i==j) continue;
66                 point p1,p2;
67                 p1.x = p[i].x+(p[i].y-p[j].y);
68                 p1.y = p[i].y-(p[i].x-p[j].x);
69                 p2.x = p[j].x+(p[i].y-p[j].y);
70                 p2.y = p[j].y-(p[i].x-p[j].x);
71                 if(!find(p1)) continue;
72                 if(!find(p2)) continue;
73                 ans++;
74             }
75         printf("%d\n",ans/4);
76     }
77     return 0;

poj2002Squares(点集组成正方形数)

时间: 2024-11-04 13:32:23

poj2002Squares(点集组成正方形数)的相关文章

最小路径覆盖,最小点覆盖,最大独立点集

原文地址:http://blog.csdn.net/l04205613/article/details/6278394 node  1:最小路径覆盖 在一个PXP的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集.由上面可以得出:1.一个单独的顶点是一条路径:2.如果存在一路径p1,p2

最小路径覆盖,最小点覆盖,最大独立点集(转)

来自:http://blog.csdn.net/l04205613/article/details/6278394 node  1:最小路径覆盖 在一个PXP的有向图中,路径覆盖就是在图中找一些路经,使之覆盖了图中的 所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一 次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径: 2.如果存在一路径p1

[Bnuz OJ]1176 小秋与正方形

传送门 问题描述 某天,acm的小秋拿到了一张很大很大的纸.他现在打算把它撕成正方 形.但是他没有任何工具,没有尺子,所以他尝试一种有趣的方法切分矩形.假设这是一个a*b的矩形(a>b),那么小秋会先把矩形的一个角如图所示 折起,这样右边就会形成一个正方形,然后把正方形切割出来,如果还存在长方形,小秋会继续这样把正方形切出来,现在要求你编写程序,输出小秋这样做最终能 得到多少个正方形. 输入要求 输入数据有多组. 每个测试数据占一行,有两个整数a,b分别代表小秋所拿到的纸的长和宽(1 ≤ b <

POJ 1466 Girls and Boys 求最大独立点集

最大独立点集 = 点数 - 最大匹配数 注意这题因为是两两匹配,A匹配B B匹配A算两个,所以最大匹配数要除以2 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #in

求m行n列个方格的正方形总数

一个算法题: 一个m行n列的方格,问一共有多少个长方形和正方形? 我说下我的思路:1.长方形和正方形类似,就是判断条件不一样而已.2.先找出正方形数 a.将m*n方格的图形每个点记录成(m+1)*(n+1)的矩阵,m行个格对应m+1行个点,n列类似. b.先以左下角第一个点为起点开始标记,记为(x11,y11). c.寻找右上角的点,循环遍历除去标记点的所有点,当目标点(X,Y)满足 X-x11 = Y-y11 > 0, 数量加1. d.上一步遍历完成后,返回b,将起点变为(x12,y12),标

数学(容斥计数):LNOI 2016 方

Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形 成了多少个正方形(换句话说,正方形的四个顶点都是格点).但是这个问题对于我们来说太难了,因为点数太多 了,所以上帝删掉了这(N+1)×(M+1)中的K个点.既然点变少了,问题也就变简单了,那么这个时候这些格点组成 了多少个正方形呢? Input 第一行三个整数

【POJ3435】Sudoku Checker,注意:这不是数独!!!!

题意:给一个边长n*n的正方形数阵,然后问每一行.列.阵当前有值的数有没有重,你看一下两个样例就知道了. 题解:你想我告诉你怎么做?--如果这都不会,你该有多水啊.直接一byte一byte扒代码吧. 代码: #include <cstdio> #include <cstring> using namespace std; #define N 105 int map[N][N],visit[N],n,m; int main() { // freopen("test.in&q

bzoj4558: [JLoi2016]方

Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形 成了多少个正方形(换句话说,正方形的四个顶点都是格点).但是这个问题对于我们来说太难了,因为点数太多 了,所以上帝删掉了这(N+1)×(M+1)中的K个点.既然点变少了,问题也就变简单了,那么这个时候这些格点组成 了多少个正方形呢? Input 第一行三个整数

Tyvj P1813 [JSOI2008]海战训练

P1813 [JSOI2008]海战训练 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 为了准备高层峰会,元首命令武装部队必须处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了JS-2008飞机.此外,巡洋船只和舰队将被派去保护海岸线. 但不幸的是因为种种原因,海军部仅有很少的几位军官能指挥大型海战.因此,他们考虑培养一些新的海军指挥官,为此选择了“海战”这一游戏来帮助训练. 在这个著名的游戏中,一个方形的盘上放置了固定数量和形状的船只