Squares
Time Limit: 3500 MSMemory Limit: 65536 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description
A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property.
So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates.
Input
Output
Sample Input
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
Sample Output
1 6 1
题意是给你n个点,问你能找到多少个正方形.
思路:对任意两个点遍历,判断其能组成正方形的点的坐标是否存在.这里就需要在输入点的时候对点hash处理,我这里用的是map,但后来发现超时了,将map的调用改为用count()后就刚好能过.
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int MAX = 20009;
struct Point{
int x,y;
}point[1009];
long long solve(int x,int y)
{
return x+MAX+(y+MAX)*(MAX*2);
}
int main()
{
int pointnum;
while(scanf("%d",&pointnum) != EOF){
if(pointnum == 0)
return 0;
map<long long,int>mapp;
long long ans = 0;
int x1,x2,y1,y2;
for(int i = 0;i < pointnum;i++){
scanf("%d%d",&point[i].x,&point[i].y);
long long number = solve(point[i].x,point[i].y);
mapp[number] = 2;
}
for(int i = 0;i < pointnum;i++){
for(int j = i+1;j < pointnum;j++){
x1 = point[i].x;
y1 = point[i].y;
x2 = point[j].x;
y2 = point[j].y;
long long a = x1-(y2-y1)+MAX+(2*MAX)*(MAX+y1+x2-x1);
long long b = x2+(y1-y2)+MAX+(2*MAX)*(MAX+y2-(x1-x2));
if(mapp.count(a) && mapp.count(b)){
ans++;
}
a = x2-(y1-y2)+MAX+(2*MAX)*(MAX+y2+(x1-x2));
b = x1+y2-y1+MAX+(2*MAX)*(MAX+y1-(x2-x1));
if(mapp.count(a) && mapp.count(b)){
ans++;
}
}
}
printf("%lld\n",ans/4);
mapp.clear();
}
return 0;
}