思路是求(0,0)到输入第一个点的距离减去(0,0)到输入的第二个点的距离。每个距离又分为两种情况,第一种为斜率为负一的线距离和,利用横纵坐标之和确定的点在第p跟斜率为负一的线,先求前(p-1)跟的距离和 利用等差公式,从第一根到第(p-1)跟长度分别为根号2,2倍根号2…(p-1)根号2。(p-1)(1+p-1)/2sqrt(2),sum=(p-1)psqrt(2)/2;再加上点所占第p跟斜率为负一的直线为m*sqrt(2)。第二种为斜率非负一的直线和利用勾股定理求第p跟前面所有斜率为负一的直线距离和,注意第一个直线也可用此公式求值,根号下1^2 -0^2还等于一,所以不需要单独拿出来考虑,直接累加即可。
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
double juli(int m, int n);
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
printf("%.3lf\n",fabs(juli(x1,y1)-juli(x2,y2)));
}
return 0;
}
double juli(int m, int n)
{
int i,p=m+n;
double sum=p*(p-1)*sqrt(2)/2;
sum+=m*sqrt(2);
for(i=p;i>0;i--)
sum+=sqrt((i-1)*(i-1)+i*i);
return sum;
}