数三角形

数三角形

牛客网上流传的一道拼多多笔试题。

题目描述

给出平面上的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;
}
原文地址:https://www.cnblogs.com/zhcpku/p/15207867.html