题目链接:https://cn.vjudge.net/problem/URAL-1963
题目大意:给你一个四边形的n个点,让你判断对称点的个数(对称轴的个数*2)。
具体思路:感谢qyn的讲解,具体的判断过程如下,首先判断两条对角线是不合法的。对于当前的对角线,(x2,y2)与(x4,y4)形成的对角线,我们只需要判断第一个点与第四个点形成的距离和第三个点和第四个点形成的距离是不是相同的,以及第二个点与第一个点形成的距离和第三个点和第二个点形成的距离是不是相等就能判断出来了。第二条对角线的判断方法类似。
然后再开始判断每条边的中点是不是合法的,这里的判断方法是,先判断是不是矩形,如果是矩形的话,直接就是有4个点是符合的。然后再开始讨论梯形的情况,只判断腰是不是相等的就可以判断出是不是有两个点是不是合法的(注意有两个梯形)。然后需要排除一种可能性,就是平行四边形,平行四边的两个梯形的判断方法都能符合,所以当时平行四边形的时候对原来的答案减去4就可以了。
AC代码:
1 #include<iostream> 2 #include<stack> 3 #include<cmath> 4 #include<map> 5 #include<algorithm> 6 #include<vector> 7 #include<stdio.h> 8 #include<queue> 9 #include<string> 10 #include<cstring> 11 using namespace std; 12 const int maxn = 2100; 13 # define inf 0x3f3f3f3f 14 bool judge(int x1,int y1,int x2,int y2){ 15 if(x1*x2+y1*y2==0)return true; 16 return false; 17 } 18 int dis(int x1,int y1,int x2,int y2){ 19 return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); 20 } 21 int main(){ 22 int x1,y1,x2,y2; 23 int x3,y3,x4,y4; 24 scanf("%d %d",&x1,&y1); 25 scanf("%d %d",&x2,&y2); 26 scanf("%d %d",&x3,&y3); 27 scanf("%d %d",&x4,&y4); 28 int ans=0; 29 if(judge(x3-x1,y3-y1,x4-x2,y4-y2)){ 30 if(dis(x4,y4,x1,y1)==dis(x4,y4,x3,y3)&&dis(x2,y2,x1,y1)==dis(x2,y2,x3,y3))ans+=2; 31 if(dis(x3,y3,x4,y4)==dis(x3,y3,x2,y2)&&dis(x1,y1,x2,y2)==dis(x1,y1,x4,y4))ans+=2; 32 } 33 int tot=0; 34 if(judge(x3-x4,y3-y4,x1-x4,y1-y4))tot++; 35 if(judge(x4-x1,y4-y1,x2-x1,y2-y1))tot++; 36 if(judge(x1-x2,y1-y2,x3-x2,y3-y2))tot++; 37 if(judge(x4-x3,y4-y3,x2-x3,y2-y3))tot++; 38 if(tot>=3){ 39 ans+=4; 40 } 41 int k=0; 42 if(dis(x4,y4,x1,y1)==dis(x3,y3,x2,y2)){ 43 ans+=2; 44 k++; 45 } 46 if(dis(x3,y3,x4,y4)==dis(x2,y2,x1,y1)){ 47 ans+=2; 48 k++; 49 } 50 if(k==2)ans-=4; 51 printf("%d ",ans); 52 return 0; 53 }