CF 18A(近似直角三角形判断+向量直角公式+switch+istream&(..&P a))

A. Triangle
time limit per test

2 seconds

memory limit per test

64 megabytes

input

standard input

output

standard output

判断一个格点三角形是直角三角形,近似直角三角形,还是都不是.

Hint:近似直角三角形是指把一个三角形的一个点移动1个单位长度(移动后仍为格点三角形),其能变成直角三角形的非直角三角形

Input

 x1, y1, x2, y2, x3, y3 表示3点坐标(都在格点上),不超过
100.

Output

I直角三角形输出 RIGHT,

近似直角三角形输出
 ALMOST, 都不是输出 NEITHER.

Sample test(s)
input
0 0 2 0 0 1
output
RIGHT
input
2 3 4 5 6 6
output
NEITHER
input
-1 0 2 0 0 1
output
ALMOST

各种判断…

注意格点三角形在移动完可能出现点重合(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.xb.y-a.yb.x;} int dis2(){return xx+yy; } friend bool right_angle(V a,V b){return pow(ab,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&lt;&lt;&quot;RIGHT&quot;;break;
    case 2:cout&lt;&lt;&quot;ALMOST&quot;;break;
    default:cout&lt;&lt;&quot;NEITHER&quot;;
}
cout&lt;&lt;endl;

return 0;

}