Atcoder #beginner224 C题

Atcoder #beginner224 C题,第1张

Atcoder #beginner224 C题

题目描述:

坐标上N个点,求可以构成的三角形的数目

文章目录
      • 代码一
      • 代码二

思路:
枚举N个顶点所可以构成的所有连线,对于每一条连线,遍历其余的所有点,判断该点与该线段是否共线。

代码

通过斜率判断是否共线。

#include 
using namespace std;

const int N = 300; //点的数目
int x[N], y[N]; //分别存储x坐标和y坐标

bool f(int i, int j, int k) 
{
    if (x[i] == x[j] && x[i] == x[k]) return false;
    if (y[i] == y[j] && y[i] == y[k]) return false;
    if ((y[k] - y[j]) * (x[j] - x[i]) == (y[j] - y[i]) * (x[k] - x[j])) return false;
    return true;

}
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i ++)
        cin >> x[i] >> y[i];
        
    int cnt = 0;
    for (int i = 0; i < n; i ++)
        for (int j = i + 1; j < n; j ++) //枚举所有连线(无重复)
            for (int k = 0; k < n; k ++) //判断点k是否在这条连线上
            {
                if (k == i || k == j) continue; //若与之前点发生重复则跳过
                if (f(i, j, k)) cnt ++; //不共线,则cnt++
            }
    cout << cnt / 3; //每个三角形被计了3次
    return 0;
}
代码二

通过三点所围的面积是否为0来判断3点是否共线。

已知 A ( x 1 , y 1 ) , B ( x 2 , y 2 ) , C ( x 3 , y 3 ) A(x_1, y_1),B(x_2,y_2),C(x_3,y_3) A(x1​,y1​),B(x2​,y2​),C(x3​,y3​),则 S △ A B C = x 1 y 2 − x 2 y 1 + x 2 y 3 − x 3 y 2 + x 3 y 1 − x 1 y 3 2 S_{△ABC} = frac{x_1y_2-x_2y_1+x_2y_3-x_3y_2+x_3y_1-x_1y_3}{2} S△ABC​=2x1​y2​−x2​y1​+x2​y3​−x3​y2​+x3​y1​−x1​y3​​

bool f(int i, int j, int k)
{
    if (x[i] * y[j] - x[j] * y[i] + x[j] * y[k] - x[k] * y[j] + x[k] * y[i] - x[i] * y[k] == 0) return false;
    return true;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4749745.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-08
下一篇 2022-11-08

发表评论

登录后才能评论

评论列表(0条)

保存