CodeForces - 18A Triangle(数学?)
题意:
给出三个点的坐标,初始,这三个点可以构成一个三角形。
如果初始坐标可以构成直角三角形,输出"RIGNT"。
如果某个点的 x或y 坐标移动一个单位后可以组成直角三角形,输出"ALMOST"。
如果不能构成直角三角形,输出"NEITHER"。
题解:
我的思路:
如何判断是否含有直角呢--向量。
a,b,c 三点可以构成三条向量 ab,ab,bc(不考虑方向),如果存在某两条向量的点乘积为0,那么这两个向量垂直。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define P pair<int ,int > 5 6 struct Node 7 { 8 int x,y; 9 }a[3]; 10 P p[3]; 11 12 void updata()//更新向量 13 { 14 for(int i=0;i < 3;++i) 15 { 16 p[i].first=a[(i+1)%3].x-a[i].x; 17 p[i].second=a[(i+1)%3].y-a[i].y; 18 } 19 } 20 bool isSat()//判断是否有重合的两点 21 { 22 for(int i=0;i < 3;++i) 23 if(p[i].first == 0 && p[i].second == 0) 24 return false; 25 return true; 26 } 27 int product(int i,int j)//点乘积 28 { 29 return p[i].first*p[j].first+p[i].second*p[j].second; 30 } 31 bool Check() 32 { 33 updata(); 34 if(!isSat()) 35 return false; 36 if(!product(0,1) || !product(1,2) || !product(0,2)) 37 return true; 38 return false; 39 } 40 char *Solve() 41 { 42 if(Check()) 43 return "RIGHT"; 44 for(int i=0;i < 3;++i) 45 { 46 //i点的x右移一个单位,以下同理 47 a[i].x++; 48 if(Check()) 49 return "ALMOST"; 50 a[i].x--; 51 52 a[i].x--; 53 if(Check()) 54 return "ALMOST"; 55 a[i].x++; 56 57 a[i].y++; 58 if(Check()) 59 return "ALMOST"; 60 a[i].y--; 61 62 a[i].y--; 63 if(Check()) 64 return "ALMOST"; 65 a[i].y++; 66 } 67 return "NEITHER"; 68 } 69 int main() 70 { 71 for(int i=0;i < 3;++i) 72 scanf("%d%d",&a[i].x,&a[i].y); 73 printf("%s\n",Solve()); 74 return 0; 75 }