算是一道基础题吧,主要在于如何巧妙地判断平行四边形,看了别人的代码,题解如下
平行四边形判定条件
(x1,y1),(x2,y2),(x3,y3),(x4,y4)
1,3;2,4为两条对角线
x1+x3 == x2+x4 && y1+y3 == y2+y4则为四边形,说白了就是,两条对角线横坐标、纵坐标分别相加(或相减后相等)
证明:
根据平行四边形定义可得
x1+m = x4 y1+n = y4
x2+m = x3 y2+n = y3
所以 x1+x3+m = x2+x4+m 即 x1+x3 = x2+x4
福利:
判断两直线(线段)位置关系
A(a,b) , B(c,d)
X1 = (int)fabs(a-c);
Y1 = (int)fabs(b-d);
X2 = (int)fabs(a-c);
Y2 = (int)fabs(b-d);
if(X1*Y2 == X2*Y1)
printf("这两条线不相交
");
else
printf("这两条线相交
");
用STLmap存储数据,当键值为两个时,要用pair
#include <stdio.h> #include <iostream> #include <string> #include <algorithm> #include <string> #include <string.h> #include <math.h> #include <map> #define MAXN 2005 using namespace std; int main() { //freopen("caicai.txt","r",stdin); map<pair<int,int>,int>point; int x[MAXN],y[MAXN]; int n; scanf("%d",&n); int i,j,ans = 0; for(i = 0;i<n;i++) { scanf("%d%d",&x[i],&y[i]); for(j = 0;j<i;j++) ans += point[make_pair(x[i]+x[j],y[i]+y[j])]++;//ans += point[{x[i]+x[j],y[i]+y[j]}]++; CF是拒绝的。 } cout<<ans<<endl; return 0; }