牛客多校3 - Operation Love(几何+叉积确定三点顺逆)
生活随笔
收集整理的這篇文章主要介紹了
牛客多校3 - Operation Love(几何+叉积确定三点顺逆)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:在平面直角坐標系中給出一只手的輪廓,需要判斷是左手還是右手
題目分析:因為這些點在給出時不能確定時順時針還是逆時針給出,所以我們需要自己來判斷,這里存一下給出三點判斷順時針還是逆時針的板子(其實就是個叉積計算三角形面積的應用),當判斷出給出的圖形是順時針還是逆時針輸入的時候,無非只有四種情況,分類討論一下就好了,這里我選擇的是最底下的長度為 9 的邊和兩側長度分別為 6 和 8 的邊討論
因為題目給出的數據誤差較大,所以在比較大小的時候,要么eps設的大一點,或者可以干脆直接比較兩條邊的相對長度大小就好了,因為任意兩邊的距離之差還是蠻大的
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e6+100;const double eps = 1e-8;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1; }struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}void output(){printf("%.2f %.2f\n",x,y);}bool operator == (Point b)const{return sgn(x-b.x) == 0 && sgn(y-b.y) == 0;}bool operator < (Point b)const{return sgn(x-b.x)== 0?sgn(y-b.y)<0:x<b.x;}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉積double operator ^(const Point &b)const{return x*b.y - y*b.x;}//點積double operator *(const Point &b)const{return x*b.x + y*b.y;}//返回長度double len(){return hypot(x,y);//庫函數}//返回長度的平方double len2(){return x*x + y*y;}//返回兩點的距離double distance(Point p){return hypot(x-p.x,y-p.y);}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator *(const double &k)const{return Point(x*k,y*k);}Point operator /(const double &k)const{return Point(x/k,y/k);}//`計算pa 和 pb 的夾角`//`就是求這個點看a,b 所成的夾角`//`測試 LightOJ1203`double rad(Point a,Point b){Point p = *this;return fabs(atan2( fabs((a-p)^(b-p)),(a-p)*(b-p) ));}//`化為長度為r的向量`Point trunc(double r){double l = len();if(!sgn(l))return *this;r /= l;return Point(x*r,y*r);}//`逆時針旋轉90度`Point rotleft(){return Point(-y,x);}//`順時針旋轉90度`Point rotright(){return Point(y,-x);}//`繞著p點逆時針旋轉angle`Point rotate(Point p,double angle){Point v = (*this) - p;double c = cos(angle), s = sin(angle);return Point(p.x + v.x*c - v.y*s,p.y + v.x*s + v.y*c);} }point[30]; //判斷三角形頂點的方向。返回1表示順時針,0表示三點共線,-1表示逆時針。 int ccw(Point a, Point b, Point c) {double x1 = a.x, y1 = a.y;double x2 = b.x, y2 = b.y;double x3 = c.x, y3 = c.y; double v = (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);if(v<0)return 1;elsereturn -1; }int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n=20;for(int i=0;i<n;i++)point[i].input();int mark=n-1;double mmax=point[0].distance(point[n-1]);for(int i=0;i<n-1;i++){if(point[i].distance(point[i+1])>mmax){mmax=point[i].distance(point[i+1]);mark=i;}}Point A=point[((mark-1)%n+n)%n],B=point[mark],C=point[(mark+1)%n],D=point[(mark+2)%n];if(sgn(A.distance(B)<C.distance(D))){if(ccw(A,B,C)==-1)puts("right");elseputs("left");}else{if(ccw(A,B,C)==-1)puts("left");elseputs("right");}}return 0; }?
總結
以上是生活随笔為你收集整理的牛客多校3 - Operation Love(几何+叉积确定三点顺逆)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客多校2 - Interval(网格图
- 下一篇: 扩展欧几里得求解ax+by=c的特殊解(