| Time Limit: 3500MS | Memory Limit: 65536K | |
| Total Submissions: 15137 | Accepted: 5749 |
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
Source
1 /* 2 题意:给你1000个点的坐标(x,y),让你找出能 3 构成正方形的个数。 4 思路:由于是1000,则枚举两个点,求出相应的另外 5 两个点的坐标。然后用二分判断是否两个点都存在。 6 7 8 就个人而言,关键在 "求出相应的另外两个点的坐标" 9 设两个点a1,a2; 10 由a1为中心,逆时针旋转求出 11 a3.x=a1.y-a2.y+a1.x; 12 a3.y=a2.x-a1.x+a1.y; 13 由a2为中心,顺时针旋转求出 14 a4.x=a1.y-a2.y+a2.x; 15 a4.y=a2.x-a1.x+a2.y; 16 由于被计算两次,所以除2 17 */ 18 #include<iostream> 19 #include<stdio.h> 20 #include<cstring> 21 #include<cstdlib> 22 #include<algorithm> 23 using namespace std; 24 25 typedef struct 26 { 27 int x,y; 28 }node; 29 node a[1003]; 30 bool cmp(node n1,node n2) 31 { 32 if( n1.x!=n2.x ) 33 return n1.x<n2.x; 34 else return n1.y<n2.y; 35 } 36 bool query(int l,int r,node cur) 37 { 38 int mid; 39 while(l<=r) 40 { 41 mid=(l+r)/2; 42 if( a[mid].x<cur.x || (a[mid].x==cur.x&&a[mid].y<cur.y)) 43 l=mid+1; 44 else if( a[mid].x>cur.x || ( a[mid].x==cur.x&&a[mid].y>cur.y)) 45 r=mid-1; 46 if( a[mid].x==cur.x && a[mid].y==cur.y) return true; 47 } 48 return false; 49 } 50 int main() 51 { 52 int n,i,j,num; 53 node a1,a2,a3,a4; 54 while(scanf("%d",&n)>0) 55 { 56 if(n==0)break; 57 for(i=1;i<=n;i++) 58 scanf("%d%d",&a[i].x,&a[i].y); 59 sort(a+1,a+1+n,cmp); 60 61 for(i=1,num=0;i<n;i++) 62 { 63 a1=a[i]; 64 for(j=i+1;j<=n;j++) 65 { 66 a2=a[j]; 67 a3.x=a1.y-a2.y+a1.x; 68 a3.y=a2.x-a1.x+a1.y; 69 if( !query(1,n,a3)) continue; 70 a4.x=a1.y-a2.y+a2.x; 71 a4.y=a2.x-a1.x+a2.y; 72 if( query(1,n,a4)) num++; 73 74 } 75 } 76 printf("%d\n",num/2); 77 } 78 return 0; 79 }
原文:http://www.cnblogs.com/tom987690183/p/3564375.html