记录编号 294433 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]几何 最终得分 100
用户昵称 Gravatar小e 是否通过 通过
代码语言 C++ 运行时间 4.403 s
提交时间 2016-08-12 06:35:12 内存使用 0.32 MiB
显示代码纯文本
//通过简短的证明可以知道,我们得出的k的答案不是4就是-1;
//所以,我们只需要判断正四边形是否出现就可以了,
//然后我们要做的就是(n^2)枚举点对,
//然后通过这两个点,计算出另外两个点的坐标,
//再判断另外两个点是否存在就可以了。
//至于计算另外两个点的坐标,我们可以应用三角形全等的知识求出另外两个点的坐标。
//然后我们把点排序(先x, x相同时y),然后我们二分查找坐标就可以了。
//--Skyminer

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

int N;
pair <int, int> P[1010];
map <pair <int, int>, bool> ma;

inline int Read()
{
	int a = 0, minus = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-')	minus = -1;
		ch = getchar();
	}	
	while(ch >= '0' && ch <='9'){
		a = a*10 + ch-'0';
		ch = getchar();
	}
	return a * minus;
}

inline int Abs(const int& a)
{
	if(a < 0)	return -a;
	return a;
}

int main()
{
	freopen("geometry.in", "r", stdin); freopen("geometry.out", "w", stdout);
	int T = Read();
	while(T--){
		ma.clear();
		N = Read();
		for(int i = 1; i <= N; i++){
			int x = Read(), y = Read();
			P[i] = make_pair(x, y);
			ma[P[i]] = 1;
		}
		//for(int i = 1; i <= N; i++)	printf("x:%d y:%d\n", P[i].first, P[i].second);
		for(int i = 1; i <= N; i++){
			for(int j = i+1; j <= N; j++){
				int tx = Abs(P[i].first - P[j].first), ty = Abs(P[i].second - P[j].second);
				//横纵坐标的差值, 用全等三角形知识求另外两个点
				int firstj = P[j].first, firsti = P[i].first, secondj = P[j].second, secondi = P[i].second;
				if((ma.count(make_pair(firstj+ty, secondj+tx))&&ma.count(make_pair(firsti+ty, secondi+tx))) || (ma.count(make_pair(firstj-ty, secondj-tx))&&ma.count(make_pair(firsti-ty, secondi-tx)))){
					puts("4");
					goto NEXT;
				}
			}
		}
		puts("-1");
		NEXT:;
	}
	fclose(stdin); fclose(stdout);
	return 0;
}
/*
2
5
1 2
1 0
2 1
0 1
1 1
4
0 1
1 2
2 1
1 1

ans: 4 -1
 */
/*
1 5
-2 1
3 4
-1 5
0 0
2 0

ans: 4
 */