构成的正方形数量
构成的正方形数量
【构成正方形数量】输入N个互不相同的二维整数坐标,求这N个坐标可以构成的正方形数量。(内积为零的的两个向量垂直)
输入描述:
第一行输入为N,N代表坐标数量,N为正整数。N<=100之后的K行输入为坐标xy以空格分隔,xy为整数,-10<=x,y<=10。
输出描述:
输出可以构成的正方形数量。
示例1
输入
3
1 3
2 4
3 1
1 3
2 4
3 1
输出
0
输入
9 0 0 1 0 2 0 0 2 1 2 2 2 0 1 1 1 2 1
输出
6
C++
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
/*
构成的正方形数量
【构成正方形数量】输入N个互不相同的二维整数坐标,求这N个坐标可以构成的正方形数量。(内积为零的的两个向量垂直)
输入描述:
第一行输入为N,N代表坐标数量,N为正整数。N<=100之后的K行输入为坐标xy以空格分隔,xy为整数,-10<=x,y<=10。
输出描述:
输出可以构成的正方形数量。
示例1
输入
3
1 3
2 4
3 1
输出
0
输入
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
输出
6
*/
bool finde(double x3, double y3, vector<vector<double>>& p);
bool cmp(vector<double> vec1, vector<double>vec2);
int main()
{
int n;
cin >> n;
vector<vector<double>> p(n);
int ans = 0;
while (getchar() != '\n');
for (int i = 0; i < n; i++)
{
double x, y;
cin >> x;
p[i].push_back(x);
cin >> y;
p[i].push_back(y);
while (getchar() != '\n');
}
//重写cm函数。
sort(p.begin(), p.end(),cmp);
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
//已知: (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) double x3 = p[i][0] + (p[j][1] - p[i][1]);
double y3 = p[i][1] - (p[j][0] - p[i][0]);
double x4 = p[j][0] + (p[j][1] - p[i][1]);
double y4 = p[j][1] - (p[j][0] - p[i][0]);
//二分法求解。
//另外一种做法是二维点hash。比较麻烦,需要处理哈希冲突,平方求余法+链接地址法。
if(finde(x3,y3,p) && finde(x4,y4,p))
{
ans++;
continue;
}
}
}
cout << "结果为:" << ans / 2;
system("pause");
return 0;
}
bool cmp(vector<double> vec1,vector<double>vec2)
{
if(vec1[0] != vec2[0])
{
return vec1[0] < vec2[0];
}else
{
return vec1[1] < vec2[1];
}
}
bool finde(double x3,double y3, vector<vector<double>>& p)
{
int left = 0;
int right = p.size() - 1;
int mid = left + (right - left) / 2;
while(left + 1 < right)
{
int mid = left + (right - left) / 2;
if(p[mid][0] < x3)
{
left = mid;
}else if(p[mid][0] > x3)
{
right = mid;
}else
{
if((p[mid][1] < y3))
{
left = mid;
}else
{
right = mid;
}
}
}
if((x3 == p[left][0] && y3 == p[left][1]) || (x3 == p[right][0] && y3 == p[right][1]))
{
return true;
}else
{
return false;
}
}