Codechef和斜率法的直角三角形

时间:2015-12-09 05:01:39

标签: c

https://www.codechef.com/problems/RIGHTRI

毕达哥拉斯定理问题很容易,但是当我用斜率法做同样的事情时,我无法找出可能出错的地方。 以下是我的代码:

#include<stdio.h>
int main()
{
    int N,count=0;
    double m1,m2,m3,x1,x2,x3,y1,y2,y3;
    scanf("%d",&N);
    while(N--){
            scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3);
            if(x1==x2||x2==x3||x3==x1){
                    if(y1==y2||y2==y3||y3==y1)
                            count++;
            }
            else{
                    //printf("hello");
                    m1=((y1-y2)*(y3-y2))/((x1-x2)*(x3-x2));
                    m2=((y1-y2)*(y1-y3))/((x1-x2)*(x1-x3));
                    m3=((y3-y2)*(y1-y3))/((x3-x2)*(x1-x3));
                    //      printf("%lf %lf %lf\n",m1,m2,m3);
                    if((m1==(-1.000000))||(m2==(-1.000000))||(m3==(-1.000000)))
                            count++;
                }
        }
        printf("%d\n",count);
        return 0;
}

新代码

#include<stdio.h>
int main()
{
    int N,count=0;
    int m1N,m1D,m2N,m2D,m3N,m3D,x1,x2,x3,y1,y2,y3;
    scanf("%d",&N);
    while(N--){
            scanf("%d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3);
            if(x1==x2||x2==x3||x3==x1){
                    if(y1==y2||y2==y3||y3==y1)
                            count++;
            }
            else{
                    m1N=((y1-y2)*(y3-y2));
                    m1D=((x1-x2)*(x3-x2));
                    m2N=((y1-y2)*(y1-y3));
                    m2D=((x1-x2)*(x1-x3));
                    m3N=((y3-y2)*(y1-y3));
                    m3D=((x3-x2)*(x1-x3));
                    if((m1N==-m1D)||(m2N==-m2D)||(m3N==-m3D))
                            count++;
            }
    }
    printf("%d\n",count);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的问题是您在if循环开始时放置的while条件,以检查是否有任何坐标具有相同的值。

如果任何2个点共享公共x坐标,并不总是必须共享一个相同的y坐标以形成一个直角三角形,您似乎在代码中假设它。示例采用这些坐标::

  

(0,0),(0,5),(2.5,2.5)

(我知道问题陈述只说整数值,但这是最容易想到的情况,我相信你可以只用整数值组成这样的测试用例。)

如果我们关注,您的代码会x1 = x2,但是,没有y值是相同的,并且您的代码不会将其视为直角三角形,尽管它是一个直角三角形。

因此,最简单的解决方案是删除第一个if条件,让其余代码运行,然后您将获得AC。

编辑::

整数坐标::

的示例
  

(0,0),(0,6),(3,3)

答案 1 :(得分:0)

编辑:m1,m2,m3是斜坡的乘积。

我认为你的方法出了什么问题,如下所示改变你的代码并加上评论:

//if(x1==x2||x2==x3||x3==x1){ not required,no such property for a right angle triangle
                    //if(y1==y2||y2==y3||y3==y1)
                            //count++;
            //}
            //else{
                    //printf("hello");
                    m1=((y1-y2)*(y3-y2))/((x1-x2)*(x3-x2));
                    m2=((y1-y2)*(y1-y3))/((x1-x2)*(x1-x3));
                    m3=((y3-y2)*(y1-y3))/((x3-x2)*(x1-x3));
                    //      printf("%lf %lf %lf\n",m1,m2,m3);
                    if( m1 == -1 ||m2==-1 || m3*m1==-1 ) //product of slope of two perpendicular lines is -1
                            count++;
  

注意:通过这种方法,您将INT应用于INT分区   可能实际上将精确的斜率修剪为不正确的值。坚持你   使用double值,然后在评估产品后将其强制转换   斜坡。

相关问题