暴力枚举,给出顶点坐标,求钝角三角形的个数

知识点
普通的枚举暴力,
钝角三角形:*AB2+AC2<AC^2(AB,AC为短的两边,AD为长边)
锐角三角形:*AB2+AC2<AC^2(AB,AC为短的两边,AD为长边)

题目:*
题目链接

牛牛得到了一个平面,这个平面上有 n 个不重合的点,第 i 个点的坐标为 (xi,yi)(x_i,y_i)(xi​,yi​)。

牛牛想知道,这 n 个点形成的三角形中,总共有多少个钝角三角形。

输入描述:
第一行,一个正整数 n,表示点数。

第二行至第 n+1 行中,第 i+1 行包含两个整数 xi,yix_i,y_ixi​,yi​,表示第 i 个点的坐标。

保证 1≤n≤5001\leq n\leq 5001≤n≤500,−104≤xi,yi≤104-10^4\leq x_i,y_i\leq 10^4−104≤xi​,yi​≤104,任意两点不重合。
输出描述:
输出一行,一个整数表示答案。
示例1
输入
0 0
-1145 1
1 0
输出
1
1
注意点:一定要先判断三点不共线,即两点间的斜率不相等,其次不要用任意两边之和大于第三边(容易卡时间,编译可能超时)

菜鸡就是大于小于不分,还有就是用二维数组来枚举导致死wa 呜呜呜`
代码区:

#include<iostream>
#include<bits/stdc++.h>//排序所需头文件名 
#include<math.h>//求平方函数 的头文件名 
using namespace std;
long long  x[1000],y[1000];//分别存放坐标x,y 
long long  lenth[4];
int main()
{
 int n,result=0;
 cin>>n;
 for(int i=0;i<n;++i)
 {
  cin>>x[i]>>y[i];
 }
 //暴力枚举分别求长度并计算三角形个数 
 for(int i=0;i<n;++i)
 {
  int j=i+1;
  for(;j<n;++j)
  {
   int k=j+1;
   for(;k<n;++k)
   {
    //求三边长度并排序 
    lenth[0]=pow(x[i]-x[j],2)+pow(y[i]-y[j],2);
    lenth[1]=pow(x[i]-x[k],2)+pow(y[i]-y[k],2);
    lenth[2]=pow(x[j]-x[k],2)+pow(y[j]-y[k],2);
    sort(lenth,lenth+3);
    //long double a,b,c;
    //a=sqrt(lenth[0]),b=sqrt(lenth[1]),c=sqrt(lenth[2]);//编译时间太长了   pass   
    //if(((a+b)>c)&&((b+c)>a)&&((a+c)>b))
    long long m =x[i]*y[k]-x[j]*y[k]+x[j]*y[i];
    long long m1=y[i]*x[k]-y[j]*x[k]+x[i]*y[j];
    if(m!=m1)//判断是否共线 
    {
     if(lenth[0]+lenth[1]<lenth[2])
     result++;
    }
   }
  }
 }
 cout<<result;
 return 0;
}

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值