标签:
Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 16908 | Accepted: 6425 |
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
-------------------------------------------------------------------
这道题的原意应该是用哈希数组解决,不过我做了将近一天还是没有AC,不是WA就是RE,等技术娴熟了再来做吧~
这道题可以用二分法来做:将点集进行排序,然后用二分法进行查找。
大致思路:按照先x后y的顺序对点集进行排序,循环选择两个点,然后计算出第三、四个点可能存在的位置,用二分法查找这样的点是否存在,若存在则计数加一。最后根据同一正方形被重复计数的次数,将计数除以相应的次数。
代码如下:
------------------------------------------------------------------
1 #include <cstdio> 2 #include <algorithm> 3 4 using namespace std; 5 6 #define N 1001 7 8 struct Node 9 { 10 int x, y; 11 }node[N]; 12 13 Node temp; 14 15 bool cmp(Node X, Node Y) 16 { 17 if(X.x == Y.x) 18 { 19 return X.y < Y.y; 20 } 21 return X.x < Y.x; 22 } 23 24 int main() 25 { 26 int n, sum = 0; 27 freopen("D:\\test.txt", "r", stdin); 28 while(scanf("%d", &n) != EOF && n) 29 { 30 sum = 0; 31 for(int i = 0; i < n; i++) 32 { 33 scanf("%d%d", &node[i].x, &node[i].y); 34 } 35 sort(node, node + n, cmp); 36 for(int i = 0; i < n; i++) 37 { 38 for(int j = i + 1; j < n; j++) 39 { 40 temp.x = node[j].x + node[i].y - node[j].y; 41 temp.y = node[j].y + node[j].x - node[i].x; 42 if(!binary_search(node, node + n, temp, cmp)) 43 { 44 continue; 45 } 46 temp.x = node[i].x + node[i].y - node[j].y; 47 temp.y = node[i].y + node[j].x - node[i].x; 48 if(binary_search(node, node + n, temp, cmp)) 49 { 50 sum++; 51 } 52 } 53 } 54 printf("%d\n", sum / 2); 55 } 56 }
标签:
原文地址:http://www.cnblogs.com/codingpenguin/p/4295102.html