构成的正方形数量

构成的正方形数量
【构成正方形数量】输入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
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;
	}
}






全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务