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
// 根据两点的位置关系递归
1 #include<stdio.h> 2 #include<math.h> 3 4 double length(int x1, int y1, int x2, int y2) 5 { 6 double s=0; 7 int t; 8 if(x1>x2) 9 { 10 t=x1; x1=x2; x2=t; 11 t=y1; y1=y2; y2=t; 12 } 13 if(x1==x2&&y1==y2) return s; 14 else 15 { 16 if(x1==0&&y1==0) 17 { s++; y1++; } 18 if(x1==0&&y2==0&&(y1-x2)==1) 19 { 20 s+=sqrt(y1*y1+x2*x2); 21 return s; 22 } 23 else if(x2-x1==y1-y2) 24 { 25 s+=(x2-x1)*sqrt(2.0); 26 return s; 27 } 28 else 29 { 30 if(x1==0) 31 { 32 s+=sqrt((y1-1)*(y1-1)+y1*y1); 33 x1=y1-1; y1=0; 34 } 35 else 36 { 37 if(x1+y1>x2+y2) 38 { 39 s+=x1*sqrt(2.0); 40 y1+=x1; x1=0; 41 } 42 else 43 { 44 s+=x2*sqrt(2.0); 45 y2+=x2; x2=0; 46 } 47 } 48 return s+length(x1,y1, x2,y2); 49 } 50 } 51 } 52 53 int main() 54 { 55 int n, x1,y1, x2,y2; 56 double s; 57 scanf("%d", &n); 58 while(n--) 59 { 60 scanf("%d %d %d %d", &x1, &y1, &x2, &y2); 61 s=length(x1,y1, x2,y2); 62 printf("%.3f\n", s); 63 } 64 return 0; 65 }
// 分别求两点到原点的距离,结果为其差的绝对值
1 #include<stdio.h> 2 #include<math.h> 3 4 double length(int x, int y) 5 { 6 double s=0; 7 int i; 8 for(i=1;i<x+y;i++) 9 s+=i*sqrt(2.0); 10 s+=x*sqrt(2.0); // 斜率为-1的路径长度 11 for(i=0;i<x+y;i++) 12 s+=sqrt(i*i+(i+1)*(i+1)); // 斜率非-1或斜率不存在的路径长度 13 return s; 14 } 15 16 int main() 17 { 18 int n, x1,y1, x2,y2; 19 double s1, s2; 20 scanf("%d", &n); 21 while(n--) 22 { 23 scanf("%d %d %d %d", &x1, &y1, &x2, &y2); 24 s1=length(x1,y1); s2=length(x2,y2); 25 printf("%.3f\n", fabs(s1-s2)); 26 } 27 return 0; 28 }