牛客 数三角(用向量方法解题)

链接:https://ac.nowcoder.com/acm/contest/3003/D
来源:牛客网
 

题目描述

牛牛得到了一个平面,这个平面上有 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

输入

复制3 0 0 -1145 1 1 0

3
0 0
-1145 1
1 0

输出

复制1

1

题意:就是给你一群点,然后求任意三个点可以组成钝角三角形的个数

题解:采用向量的方法,进行三个角的判断,如果其中只要有一个角的度数大于90度那么返回1,那么总数++;

代码如下

#include<iostream>
using namespace std;
int x[520],y[520];  //注意我们这里把它定义成了全局变量,好进行参数传递
bool judge(int a,int b,int c);
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x[i]>>y[i];
    }
    int ans=0;
//对n个点进行枚举
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            for(int k=j+1;k<n;k++){
//分别把3个点当作函数第一个参数进行传递,第一个参数返回的结果代表的是对应点是否为钝角
                if(judge(i,j,k)||judge(j,i,k)||judge(k,i,j))  ans++;
            }
        }
    }
    cout<<ans;
    return 0;
}
bool judge(int a,int b,int c){
    int res1=x[b]-x[a];
    int res2=y[b]-y[a];
    int res3=x[c]-x[a];
    int res4=y[c]-y[a];
    if(((res1*res3+res2*res4)<0)&&(res1*res4)!=(res3*res2))  return true;
//注意这里要同时满足
    else return false;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值