CodeForces

传送门

题意:

  给出三个点的坐标,初始,这三个点可以构成一个三角形。

  如果初始坐标可以构成直角三角形,输出"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
",Solve());
74     return 0;
75 }
View Code
原文地址:https://www.cnblogs.com/violet-acmer/p/10224165.html