• 数三角形


    题目描述

    给出平面上的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;
    }
    不一样的烟火
  • 相关阅读:
    团队项目-smart原则
    团队项目-作业管理系统
    团队模式和团队的开发模式是什么,它们有什么关系?
    软件工作量的估计有哪些方法?
    腾讯qq的发展史
    软件过程与项目管理(第二次作业)
    有学生提到,在大学选课的时候,可以写一个“刷课机”的程序,利用学校选课系统的弱点或漏洞,帮助某些人选到某些课程。或者帮助用户刷购票网站,先买到火车票。这些软件合法么?符合道德规范么?是在“软件工程”的研究范围么?
    mysql中explain的type的解释
    php 中类型转换 numfamat、round函数tips
    python client端收不到server端构造的结构体数据
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11011203.html
Copyright © 2020-2023  润新知