题面
【题目描述】
给出平面上一些点的坐标,统计由这些点可以组成多少个正方形。注意:正方形的边不一定平行于坐标轴。
【输入】
输入包括多组测试数据。每组的第一行是一个整数n (1 <= n <= 1000),表示平面上点的数目,接下来n行,每行包括两个整数,分别给出一个点在平面上的x坐标和y坐标。输入保证:平面上点的位置是两两不同的,而且坐标的绝对值都不大于50000。最后一组输入数据中n = 0,这组数据表示输入的结束,不用进行处理。
【输出】
对每组输入数据,输出一行,表示这些点能够组成的正方形的数目。
【样例输入】
4
1 0
0 1
1 1
0 0
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
4
-2 5
3 7
0 0
5 2
0
【样例输出】
1
6
1
算法分析
哈希表
如果枚举四个点,时间复杂度为O(N4)O(N^4)O(N4),严重超时。
对于一个正方形,有一个特性,知道任意两点,就可以知道其他两点。因此可以枚举其中两个点,计算出另外两个点,判断另外两个点是否存在。
判断某个点是否存在,使用哈希表,时间复杂度O(N2)O(N^2)O(N2)。
参考程序
#include<bits/stdc++.h>
#define N 1000100
#define M 999991
#define ll long long
using namespace std;
int h[N<

本文介绍了一种高效算法,用于统计平面上给定点集能构成的正方形数量,即使正方形边不平行于坐标轴。通过哈希表优化点存在性的检查,将时间复杂度从O(N^4)降低到O(N^2)。
最低0.47元/天 解锁文章
987

被折叠的 条评论
为什么被折叠?



