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
", s);
63     }
64     return 0;
65 }
WA
// 分别求两点到原点的距离,结果为其差的绝对值
 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
", fabs(s1-s2));
26     }
27     return 0;
28 }
AC

原文地址:https://www.cnblogs.com/goldenretriever/p/10357104.html