7F - 无限的路

时间:2023-03-09 02:52:28
7F - 无限的路
甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:

7F - 无限的路

甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。

Input

第一个数是正整数N(≤100)。代表数据的组数。 
每组数据由四个非负整数组成x1,y1,x2,y2;所有的数都不会大于100。

Output

对于每组数据,输出两点(x1,y1),(x2,y2)之间的折线距离。注意输出结果精确到小数点后3位。

Sample Input

5
0 0 0 1
0 0 1 0
2 3 3 1
99 99 9 9
5 5 5 5

Sample Output

1.000
2.414
10.646
54985.047
0.000 // 根据两点的位置关系递归
 #include<stdio.h>
#include<math.h> double length(int x1, int y1, int x2, int y2)
{
double s=;
int t;
if(x1>x2)
{
t=x1; x1=x2; x2=t;
t=y1; y1=y2; y2=t;
}
if(x1==x2&&y1==y2) return s;
else
{
if(x1==&&y1==)
{ s++; y1++; }
if(x1==&&y2==&&(y1-x2)==)
{
s+=sqrt(y1*y1+x2*x2);
return s;
}
else if(x2-x1==y1-y2)
{
s+=(x2-x1)*sqrt(2.0);
return s;
}
else
{
if(x1==)
{
s+=sqrt((y1-)*(y1-)+y1*y1);
x1=y1-; y1=;
}
else
{
if(x1+y1>x2+y2)
{
s+=x1*sqrt(2.0);
y1+=x1; x1=;
}
else
{
s+=x2*sqrt(2.0);
y2+=x2; x2=;
}
}
return s+length(x1,y1, x2,y2);
}
}
} int main()
{
int n, x1,y1, x2,y2;
double s;
scanf("%d", &n);
while(n--)
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
s=length(x1,y1, x2,y2);
printf("%.3f\n", s);
}
return ;
}

WA

// 分别求两点到原点的距离,结果为其差的绝对值
 #include<stdio.h>
#include<math.h> double length(int x, int y)
{
double s=;
int i;
for(i=;i<x+y;i++)
s+=i*sqrt(2.0);
s+=x*sqrt(2.0); // 斜率为-1的路径长度
for(i=;i<x+y;i++)
s+=sqrt(i*i+(i+)*(i+)); // 斜率非-1或斜率不存在的路径长度
return s;
} int main()
{
int n, x1,y1, x2,y2;
double s1, s2;
scanf("%d", &n);
while(n--)
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
s1=length(x1,y1); s2=length(x2,y2);
printf("%.3f\n", fabs(s1-s2));
}
return ;
}

AC