内容目录
各种判断…
注意格点三角形在移动完可能出现点重合(0向量)
仍满足向量直角公式a X b
= |a||b|
以及switch-case-default的用法。
△:default打错不会提示.
PS:istream& operator<<的重载中 输入的struct 如果不加&,是读不进的。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<functional> #include<algorithm> #include<cmath> using namespace std; struct P { int x,y; P(){} P(int _x,int _y):x(_x),y(_y){} friend istream& operator>>(istream& cin,P &a){cin>>a.x>>a.y;return cin; } void move(int d) { if (d==1) x++; if (d==-1) x--; if (d==2) y++; if (d==-2) y--; return; } }a[3]; struct V { int x,y; V(){} V(int _x,int _y):x(_x),y(_y){} V(P a,P b):x(b.x-a.x),y(b.y-a.y){} friend int operator*(V a,V b){return a.x*b.y-a.y*b.x;} int dis2(){return x*x+y*y; } friend bool right_angle(V a,V b){return pow(a*b,2)==a.dis2()*b.dis2(); } }c[3]; void res_c() { for (int i=0;i<3;i++) c[i]=V(a[i],a[(i+1)%3]); } bool is_r_trangle() { res_c(); for (int i=0;i<3;i++) if (!c[i].dis2()) return 0; for (int i=0;i<2;i++) for (int j=i+1;j<=2;j++) if (right_angle(c[i],c[j])) {/*cout<<i<<' '<<j<<endl;*/return 1;} return 0; } int solve() { if (is_r_trangle()) return 1; for (int i=0;i<3;i++) { for (int j=-2;j<=2;j++) { if (j==0) continue; a[i].move(j); if (is_r_trangle()){/*cout<<i<<' '<<j<<endl;*/ return 2;} a[i].move(-j); } } return 0; } int main() { for (int i=0;i<3;i++) cin>>a[i]; switch (solve()) { case 1:cout<<"RIGHT";break; case 2:cout<<"ALMOST";break; default:cout<<"NEITHER"; } cout<<endl; return 0; }