1.26 [hduoj] 2073 无限的路

Problem Description

甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:
 



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

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>
#define G2 sqrt(2)
double result;
int xx1,xx2,yy1,yy2,s1,s2,n;
double p2(int a,int b)
{
    double part2=0;
    for(int i=a;i<b;i++)
        part2+=sqrt(i*i+(i+1)*(i+1));
    return part2;
}
double p1(int a,int b)
{
    double part1=0;
    for(int i=a+1;i<b;i++)
        part1+=G2*i;
    return part1;
}
void main()
{
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            int flag=0;
            scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2);
            s1=xx1+yy1;
            s2=xx2+yy2;
            if(s1>s2)
            {
                int temp;
                temp=s1;
                s1=s2;
                s2=temp;
                flag=1;
            }
            if(s2-s1==0)
                result=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
            if(s2-s1==1)
            {
                if(flag==0)
                    result=sqrt((xx1-s1)*(xx1-s1)+yy1*yy1)+sqrt(s1*s1+s2*s2)+sqrt(xx2*xx2+(yy2-s2)*(yy2-s2));
                if(flag==1)
                    result=sqrt((xx2-s1)*(xx2-s1)+yy2*yy2)+sqrt(s1*s1+s2*s2)+sqrt(xx1*xx1+(yy1-s2)*(yy1-s2));
            }
            if(s2-s1!=0&&s2-s1!=1)
            {
                if(flag==0)
                    result=sqrt((xx1-s1)*(xx1-s1)+yy1*yy1)+sqrt(xx2*xx2+(yy2-s2)*(yy2-s2))+p1(s1,s2)+p2(s1,s2);
                if(flag==1)
                    result=sqrt((xx2-s1)*(xx2-s1)+yy2*yy2)+sqrt(xx1*xx1+(yy1-s2)*(yy1-s2))+p1(s1,s2)+p2(s1,s2);
            }
            printf("%.3lf\n",result);
        }
    }
}

这题我觉得不好下手,得慢慢琢磨规律。

首先,我发现根据函数,同一条线上的点,横坐标与纵坐标的和相同。

然后我把x+y=n 这个函数所在的线称为“正经的线”,从x+y=n-1过渡到x+y=n的线称为“业余的线”

我们把要算的线分成三个部分,第一个部分是除去这两个点所在的正经的线,第二个部分是所有业余的线,最后一部分是这两个点所在的正经的线。

先把这两个点的横坐标和纵坐标相加,如果相加差等于0,就直接算这两个点之间的距离就好;如果相加差等于1,就算第二部分和第三部分就好。如果大于1,那三个部分都要算。

发布了153 篇原创文章 · 获赞 4 · 访问量 3697

猜你喜欢

转载自blog.csdn.net/qq_39782006/article/details/104079370
今日推荐