Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 15489 | Accepted: 5864 |
Description
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
二维平面给定一堆点,求能够组成正方形的个数,点数为1000。因此不能枚举四个点推断。
比較优化的方法是将全部点hash。然后枚举两个点,计算出另外两个点的坐标,然后在hash表里查找,最后结果除以4,由于每一条边被统计了4次。
代码:
/* *********************************************** Author :_rabbit Created Time :2014/5/11 8:26:00 File Name :20.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=100009; class HASH{ public: struct Node{ int next,to; Node(int _next=0,int _to=0){ next=_next;to=_to; } }edge[10010]; int tol,head[maxn+10]; void clear(){ memset(head,-1,sizeof(head));tol=0; } void add(int x,int y){ if(find(x,y))return; int t=(x+maxn)%maxn; edge[tol]=Node(head[t],y); head[t]=tol++; } int find(int x,int y){ int t=(x+maxn)%maxn; for(int i=head[t];i!=-1;i=edge[i].next) if(edge[i].to==y) return 1; return 0; } }mi; int x[1010],y[1010]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n; while(~scanf("%d",&n)&&n){ mi.clear(); for(int i=0;i<n;i++){ scanf("%d%d",&x[i],&y[i]); mi.add(x[i],y[i]); // cout<<"hhh "<<endl; } ll ans=0; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++){ // cout<<"ddd"<<endl; ll x3,y3,x4,y4; x3=x[i]+(y[j]-y[i]);y3=y[i]-(x[j]-x[i]); x4=x[j]+(y[j]-y[i]);y4=y[j]-(x[j]-x[i]); if(mi.find(x3,y3)&&mi.find(x4,y4))ans++; x3=x[i]-(y[j]-y[i]);y3=y[i]+(x[j]-x[i]); x4=x[j]-(y[j]-y[i]);y4=y[j]+(x[j]-x[i]); if(mi.find(x3,y3)&&mi.find(x4,y4))ans++; // cout<<"ddd"<<endl; } ans/=4; cout<<ans<<endl; } return 0; }
版权声明:本文博客原创文章,博客,未经同意,不得转载。