A. Triangle
time limit per test
memory limit per test
input
output
判断一个格点三角形是直角三角形,近似直角三角形,还是都不是.
Hint:近似直角三角形是指把一个三角形的一个点移动1个单位长度(移动后仍为格点三角形),其能变成直角三角形的非直角三角形
Input
x1, y1, x2, y2, x3, y3
Output
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.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;
}