zoukankan      html  css  js  c++  java
  • POJ 2002 点hash

    Squares
    Time Limit: 3500MS   Memory Limit: 65536K
    Total Submissions: 15489   Accepted: 5864

    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

    The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.

    Output

    For each test case, print on a line the number of squares one can form from the given stars.

    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;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    给WPF程序增加玻璃效果
    几款不错的VisualStudio2010插件
    一种快捷的解析HTML方案
    控制台输出螺旋型数字
    POJ 3692 Kindergarten(二分图匹配)
    HDU 1150 Machine Schedule(最小点覆盖)
    POJ 1847 Tram(最短路)
    HDU 1054 Strategic Game(树形DP)
    POJ 2195 Going Home(二分图最大权值匹配)
    POJ 1811 Prime Test(大素数判断和素因子分解)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4633643.html
Copyright © 2011-2022 走看看