链接: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;
}