无限的路 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

解题报告

图中连接点的顺序为(0,0)->(0,1)->(1,0)->(0,2)->(1,1)->(2,0)->(0,3)->......

可以得知x+y较小者在前面。当点移动到x轴上时,下个点在y轴上且值为x+1。然后x坐标递增、y坐标递减,直到移动到x轴上。

通过模拟从一个点移动到另外一个点,算出两点间的距离。

AC代码

#include <cstdio>
#include <cmath>

int main(int argc, const char* argv[])
{
    int nCases = 0;
    scanf("%d", &nCases);
    while (nCases--)
    {
        int x1, y1, x2, y2;
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        if ((x1 + y1) > (x2 + y2))
        {
            x1 ^= x2 ^= x1 ^= x2;
            y1 ^= y2 ^= y1 ^= y2;
        }

        double dSum = 0.0;
        for (int i=x1, j=y1; i!=x2 || j!=y2;)
        {
            if (0 == j)
            {
                j = i + 1;
                i = 0;
                dSum += sqrt(static_cast<double>((j-1)*(j-1) + j*j));
            }
            else
            {
                ++i, --j;
                dSum += sqrt(2.0);
            }
        }
        printf("%.3f\n", dSum);
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值