数三角形
牛客网上流传的一道拼多多笔试题。
题目描述
给出平面上的n个点,现在需要你求出,在这n个点里选3个点能构成一个三角形的方案有几种。
输入描述:
第一行包含一个正整数n,表示平面上有n个点(n <= 100)
第2行到第n + 1行,每行有两个整数,表示这个点的x坐标和y坐标。(所有坐标的绝对值小于等于100,且保证所有坐标不同)
输出描述:
输出一个数,表示能构成三角形的方案数。
示例1
输入:
4
0 0
0 1
1 0
1 1
输出:
4
说明:
4个点中任意选择3个都能构成三角形
解题思路
给出了平面上一系列点,判断能构成几个三角形。考虑问题的反面,什么时候无法构成三角形?三点共线。
判断三点共线可以用向量来做,其实就是共点且斜率相同 (x1-x2) / (y1-y2) == (x1-x3) / (y1-y3)
,考虑到斜率不存在的情况,改为以下形式即可:
(x1-x2)*(y1-y3) == (y1-y2)*(x1-x3)
。
参考代码
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> x(n);
vector<int> y(n);
for (int i=0; i<n; i++) {
cin >> x[i] >> y[i];
}
int cnt = 0;
for (int i=0; i+2<n; i++) {
for (int j=i+1; j+1<n; j++) {
for (int k=j+1; k<n; k++) {
bool oneline = (x[i] - x[j]) * (y[i] - y[k]) == (y[i] - y[j]) * (x[i] - x[k]);
if (!oneline) {
cnt ++;
}
}
}
}
printf("%d
", cnt);
return 0;
}