• 数三角形


    题目描述

    给出平面上的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;
    }
    不一样的烟火
  • 相关阅读:
    jsp——java服务页面
    会话管理——cookie和session技术
    [Java]如何为一个自定义类型的List排序。
    silverlight——获取控件相对位置
    C#操作xml文件
    [转载]Unicode中对中文字符的编码
    silverlight——多次异步调用的顺序执行
    内心需要跟我一起长大
    生活总是问题叠着问题,而任务就是一件问题一件问题的解决~
    真的该学点新的东西了。
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11011203.html
Copyright © 2020-2023  润新知