• 数三角形


    数三角形

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

    题目描述

    给出平面上的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;
    }
    
  • 相关阅读:
    卷积神经网络
    自适应学习率调整:AdaDelta
    协同过滤推荐算法总结
    深入FM和FFM原理与实践
    一些关于量化交易的书籍清单(转)
    矩阵分解在协同过滤推荐算法中的应用
    交替最小二乘ALS
    Mocha的单元测试实战
    Fis3前端工程化之项目实战
    Fis3的前端工程化之路[三大特性篇之声明依赖]
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15207867.html
Copyright © 2020-2023  润新知