杭电2073,求代码详解.甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:甜甜的好朋友蜜蜜发现上面的

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/09 07:18:19
杭电2073,求代码详解.甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:甜甜的好朋友蜜蜜发现上面的

杭电2073,求代码详解.甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:甜甜的好朋友蜜蜜发现上面的
杭电2073,求代码详解.
甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:




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

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>


int main(void)
{
\x05int i,j,n,x1,x2,y1,y2;
    double d[1000],l1,l2;
\x05d[1]=1;
\x05d[0]=0;
\x05for(j=2;j<=1000;j++)
\x05{
      d[j]=d[j-1]+sqrt(2.0)*(j-1)+sqrt((double)(j*j+(j-1)*(j-1)));
\x05}
\x05scanf("%d",&n);
\x05for(i=1;i<=n;i++)
\x05{
\x05\x05scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        l1=d[x1+y1]+sqrt(2.0)*x1;
\x05\x05l2=d[x2+y2]+sqrt(2.0)*x2;
\x05\x05if((l2-l1)>0)
     \x05\x05printf("%.3lf\n",l2-l1);
\x05\x05else 
\x05\x05\x05printf("%.3lf\n",l1-l2);
\x05}
\x05return 0;
}

杭电2073,求代码详解.甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:甜甜的好朋友蜜蜜发现上面的
首先你要明白d数组的作用,d里面存的是依次是(0,0),(0,1),(0,2),(0,3).到原点(即(0,0))的距离.由于图片上每一点到原点的距离都可用原点该点所在斜线与y轴交点的距离加上该店到交点的距离
例:(1,3)到原点的距离可以算作(0,3)到原点的距离加上(0,3)到(1,3)的距离,而(0,3)到(1,3)的距离可以用其x坐标乘以根号2求得,每一小段是根号2
所以,代码中l1,l2分别表示两点到原点的距离,相减即为两点间的距离,算法真的很精妙.
*注:所有的距离均为折线距离,斜率为-1的直线上的点x,y坐标之和为定值,所以代码中使用d(x+y)计算(0,0)到(0,3)的距离.

纯手打,望采纳!