给一些点找正方形,其实就是枚举每两个点所形成的线段看它是否能和其它点组成正方形,将所有的点存在hash表里,然后枚举两个点,算出它能生成的正方形的另外两点的坐标,如果都在hash表里,则说明这两点连线能够生成一个正方形。
另外,在考察每一个正方形,共有四条边,也就是说它在运算过程中被算了四次,最后ans再除以4便是答案。
View Code
1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 static int x[]=new int[2500]; 6 static int y[]=new int[2500]; 7 public static void main(String arg[]) 8 { 9 Scanner cin=new Scanner(System.in); 10 int n; 11 while(cin.hasNext()) 12 { 13 n=cin.nextInt(); 14 HashSet<Integer> hash=new HashSet<Integer>(); 15 for(int i=0;i<n;i++) 16 { 17 x[i]=cin.nextInt(); 18 y[i]=cin.nextInt(); 19 hash.add(20001*(x[i]+10000)+y[i]+10000); 20 } 21 int ans=0; 22 for(int i=0;i<n;i++) 23 { 24 for(int j=i+1;j<n;j++) 25 { 26 int ax,ay,bx,by; 27 ax=x[i]-(y[j]-y[i]); 28 ay=y[i]+(x[j]-x[i]); 29 if(ax>=-10000&&ax<=10000&&ay>=-10000&&ay<=10000&&hash.contains(20001*(ax+10000)+ay+10000)) 30 { 31 bx=ax+(x[j]-x[i]); 32 by=ay+(y[j]-y[i]); 33 if(bx>=-10000&&bx<=10000&&by>=-10000&&by<=10000&&hash.contains(20001*(bx+10000)+by+10000)) 34 ans++; 35 } 36 ax=x[i]+(y[j]-y[i]); 37 ay=y[i]-(x[j]-x[i]); 38 if(ax>=-10000&&ax<=10000&&ay>=-10000&&ay<=10000&&hash.contains(20001*(ax+10000)+ay+10000)) 39 { 40 bx=ax+(x[j]-x[i]); 41 by=ay+(y[j]-y[i]); 42 if(bx>=-10000&&bx<=10000&&by>=-10000&&by<=10000&&hash.contains(20001*(bx+10000)+by+10000)) 43 ans++; 44 } 45 } 46 } 47 System.out.println(ans/4); 48 } 49 } 50 }