当前位置: 代码迷 >> 综合 >> 无限的路 2073
  详细解决方案

无限的路 2073

热度:44   发布时间:2023-12-18 22:46:49.0

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;
}