luogu1355 神秘大三角
题解:
计算几何入门题
按逆时针方向访问三角形的边
然后作叉积判断点是否在边的顺时针方向
叉积和点积都有分配率 但不满足结合律
代码:
#include <bits/stdc++.h> using namespace std; #define rint register int #define IL inline #define rep(i,h,t) for (int i=h;i<=t;i++) #define dep(i,t,h) for (int i=t;i>=h;i--) #define me(x) memset(x,0,sizeof(x)) #define mid ((h+t)>>1) namespace IO{ char ss[1<<24],*A=ss,*B=ss; IL char gc() { return A==B&&(B=(A=ss)+fread(ss,1,1<<24,stdin),A==B)?EOF:*A++; } template<class T>void read(T &x) { rint f=1,c; while (c=gc(),c<48||c>57) if (c=='-') f=-1; x=(c^48); while (c=gc(),c>47&&c<58) x=(x<<3)+(x<<1)+(c^48); x*=f; } }; using namespace IO; struct Point{ int x,y; Point(){}; Point(int x1,int y1) { x=x1,y=y1; } Point operator +(const Point b)const { return Point(x+b.x,y+b.y); } Point operator -(const Point b)const { return Point(x-b.x,y-b.y); } int operator *(const Point b)const { return b.x*x+b.y*y; } int operator ^(const Point b)const { return x*b.y-y*b.x; } bool operator ==(const Point b)const { if (y==b.y&&x==b.x) return(1); else return(0); } }; struct Line{ Point x,y; Line() {}; Line(Point x1,Point y1) { x=x1,y=y1; } }; int main() { int x1,y1,x2,y2,x3,y3,x,y; Point p1,p2,p3,p; read(x1); read(y1); p1=Point(x1,y1); read(x2); read(y2); p2=Point(x2,y2); read(x3); read(y3); p3=Point(x3,y3); read(x); read(y); p=Point(x,y); if (((p3-p1)^(p2-p1))>0) swap(p3,p1); if (p==p1||p==p2||p==p3) { cout<<4<<endl; exit(0); } int tt=1; if (((p3-p1)^(p-p1))>0) tt=2; if (((p3-p1)^(p-p1))==0) tt=3; if (((p1-p2)^(p-p2))>0) tt=2; if (((p1-p2)^(p-p2))==0) tt=3; if (((p2-p3)^(p-p3))>0) tt=2; if (((p2-p3)^(p-p3))==0) tt=3; cout<<tt<<endl; return 0; }