CodeForces - 18A Triangle(数学?)
2024-10-09 19:43:29
题意:
给出三个点的坐标,初始,这三个点可以构成一个三角形。
如果初始坐标可以构成直角三角形,输出"RIGNT"。
如果某个点的 x或y 坐标移动一个单位后可以组成直角三角形,输出"ALMOST"。
如果不能构成直角三角形,输出"NEITHER"。
题解:
我的思路:
如何判断是否含有直角呢--向量。
a,b,c 三点可以构成三条向量 ab,ab,bc(不考虑方向),如果存在某两条向量的点乘积为0,那么这两个向量垂直。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define P pair<int ,int > struct Node
{
int x,y;
}a[];
P p[]; void updata()//更新向量
{
for(int i=;i < ;++i)
{
p[i].first=a[(i+)%].x-a[i].x;
p[i].second=a[(i+)%].y-a[i].y;
}
}
bool isSat()//判断是否有重合的两点
{
for(int i=;i < ;++i)
if(p[i].first == && p[i].second == )
return false;
return true;
}
int product(int i,int j)//点乘积
{
return p[i].first*p[j].first+p[i].second*p[j].second;
}
bool Check()
{
updata();
if(!isSat())
return false;
if(!product(,) || !product(,) || !product(,))
return true;
return false;
}
char *Solve()
{
if(Check())
return "RIGHT";
for(int i=;i < ;++i)
{
//i点的x右移一个单位,以下同理
a[i].x++;
if(Check())
return "ALMOST";
a[i].x--; a[i].x--;
if(Check())
return "ALMOST";
a[i].x++; a[i].y++;
if(Check())
return "ALMOST";
a[i].y--; a[i].y--;
if(Check())
return "ALMOST";
a[i].y++;
}
return "NEITHER";
}
int main()
{
for(int i=;i < ;++i)
scanf("%d%d",&a[i].x,&a[i].y);
printf("%s\n",Solve());
return ;
}
最新文章
- 猜字符游戏之java
- vuejs - the component is a fragment instance
- 11g SQL Monitor
- win7中安装redis
- C语言 结构体中的成员域偏移量
- [转]C#取得内网IP、外网IP、客户端IP方法
- request.setCharacterEncoding 和常用内置对象 跳转
- 在eclipse中查找指定文件
- poi生成excel
- mac下修改mysql登录密码
- 在.NET 应用程序设计中如何选择Class, Abstract Class and Interface
- MVC4,4月22日,Ninject的另外注入方式。
- oracle linux 安装过程错误 :Error in invoking target ‘agent nmhs’ of makefile
- ASP.Net数据库如何存取图片
- Gerrit系统框架介绍
- PyCharm中快速给选中的代码加上{}、<;>;、()、[]
- Spring Boot中Web应用的统一异常处理
- redi集群测试
- linux 内核启动流程
- vue子组件的自定义事件