数三角形

题目描述

给出平面上的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个都能构成三角形

解题思路1:只要三个点不共线就可以构成三角形
解题思路2:两边之和大于第三边,两边之差小于第三边
起初我最先想到的是第二种思路,但是只要将边长的数据类型从double换成long double类型三角形数就会减少可见这种方法会由于边长计算的不精确导致计数的错误
#include <iostream>//题解2的思路没有ac
#include <cmath>
#include <algorithm>
using namespace std;

class point{
public:
    long double x, y;
    point(long double a=0,long double b=0)
    {
    x=a;y=b;
    }
    ~point(){}
    bool same(point a,point b)
    {
        if(a.x==b.x&&a.y==b.y)
            return true;
        return false;
    }

};
int main()
{
    point arr[100];
    int point_num;
    long double x,y;//坐标
    long double a,b,c;//三角形三边长
    int cnt=0;//满足条件的三角形数量
    cin>>point_num;

    for(int i=0;i<point_num;i++)
    {
        cin>>x>>y;
        arr[i].x=x;arr[i].y=y;
    }

    for(int i=0;i<=point_num-1;i++){
        for(int j=0;j<=point_num-1;j++){
            for(int k=0;k<=point_num-1;k++){
                
                a=sqrt(pow(arr[i].x-arr[j].x,2)+pow(arr[i].y-arr[j].y,2));
                b=sqrt(pow(arr[i].x-arr[k].x,2)+pow(arr[i].y-arr[k].y,2));
                c=sqrt(pow(arr[k].x-arr[j].x,2)+pow(arr[k].y-arr[j].y,2));
                if(a+b>c&&a+c>b&&b+c>a&&a>0&&b>0&&c>0){
                    if(abs(a-b)<c&&abs(a-c)<b&&abs(b-c)<a)cnt++;
                }
                }

            }

    }cout<<cnt/6<<endl;
    //cout << "Hello world!" << endl;
    return 0;
}
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

class point{
public:
    double x, y;
    point(double a=0,double b=0)
    {
    x=a;y=b;
    }
    ~point(){}
    bool triagle(point b,point c)//判断三个点是否可以构成一个三角形
    {
        if((x-b.x)*(b.y-c.y)!=(y-b.y)*(b.x-c.x))//三点不共线
            return true;
        return false;
    }

};
int main()
{
    point arr[100];
    int point_num;
    double x,y;//坐标
    int cnt=0;//满足条件的三角形数量
    cin>>point_num;

    for(int i=0;i<point_num;i++)
    {
        cin>>x>>y;
        arr[i].x=x;arr[i].y=y;
    }

    for(int i=0;i<=point_num-1;i++){
        for(int j=0;j<=point_num-1;j++){
            for(int k=0;k<=point_num-1;k++){
                if(arr[i].triagle(arr[j],arr[k])==true){
                cnt++;

                }

            }
        }
    }

    cout<<cnt/6<<endl;//这里/6是因为123 132 213 231 321 312是一类

    return 0;
}

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

class point{
public:
    double x, y;
    point(double a=0,double b=0)
    {
    x=a;y=b;
    }
    ~point(){}
    bool triagle(point b,point c)//判断三个点是否可以构成一个三角形
    {
        if((x-b.x)*(b.y-c.y)!=(y-b.y)*(b.x-c.x))//三点不共线
            return true;
        return false;
    }

};
int main()
{
    point arr[100];
    int point_num;
    double x,y;//坐标
    int cnt=0;//满足条件的三角形数量
    cin>>point_num;

    for(int i=0;i<point_num;i++)
    {
        cin>>x>>y;
        arr[i].x=x;arr[i].y=y;
    }

    for(int i=0;i<point_num-2;i++){
        for(int j=i+1;j<point_num-1;j++){
            for(int k=j+1;k<point_num;k++){
                if(arr[i].triagle(arr[j],arr[k])==true){
                cnt++;

                }

            }
        }
    }

    cout<<cnt<<endl;//这种不用/6

    return 0;
}
不一样的烟火
原文地址:https://www.cnblogs.com/cstdio1/p/11011203.html