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;
}
答案 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值,然后在评估产品后将其强制转换 斜坡。