2020牛客暑假多校第三场 C Operation Love (计算几何/叉积确定直线位置)
Clam and Fish
https://ac.nowcoder.com/acm/contest/5668/A
Operation Love
题目链接:链接
题目大意:
给出爱丽丝的右手,由二十个点组成,已知她的左手和右手对称,然后给出二十个点,问这些点组成的手是左手还是右手。
思路:
计算长度为 6 和 9 这两个向量的叉积,如果相乘为正数,则为逆时针,为右手,反之是左手。
如图,将长度为6的向量平移之后,右手为逆时针,左手为顺时针。
左手:
ps:旋转不影响叉积符号正负。
叉积详解+例题:叉积
Code;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define eps 1e-5 using namespace std; struct node{ double x,y; }nod[25]; int t; double cal(node a,node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { scanf("%d",&t); while(t--) { for(int i = 0;i < 20;i++) scanf("%lf%lf",&nod[i].x,&nod[i].y); int m,n,p; for(int i = 0;i < 20;i++) { for(int j = i+1;j < 20;j++) { if(fabs(cal(nod[i],nod[j])-9.0) < eps) m = i,n = j; } } bool ok = false; for(int i = 0;i < 20;i++) { if(fabs(cal(nod[i],nod[m])-6.0) < eps) { p = i; ok = true; } if(fabs(cal(nod[i],nod[n])-6.0) < eps) { p = i; } } if(!ok) swap(m,n); node a,b; a.x = nod[n].x-nod[m].x; a.y = nod[n].y-nod[m].y; b.x = nod[p].x-nod[m].x; b.y = nod[p].y-nod[m].y; double judge = a.x*b.y-a.y*b.x; if(judge > 0) puts("right"); else puts("left"); } return 0; }