#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
double a[200][200];
int main()
{
a[0][0]=0;
int x=1;
int y;
int count=1;
memset(a,0,sizeof(a));
while(x<=199)
{
if(count%2!=0)
{
a[0][x]=a[x-1][0]+sqrt(x*x+(x-1)*(x-1));
count++;
}
if(count%2==0)
{
for(int i=1;i<=x;i++)
{
a[i][x-i]=a[i-1][x-i+1]+sqrt(2);
}
x++;
count++;
}
}
int x1,y1,x2,y2,k;
while(scanf("%d",&k)!=EOF)
{
while(k--)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
double ans=(a[x2][y2]-a[x1][y1]);
if(ans<0) printf("%.3f\n",-ans);
if(ans>=0) printf("%.3f\n",ans);
}
}
return 0;
}
思路直接
记count为步数,count为奇数时,两点的距离直接就可以求,count为偶数的时候,即中间有点,从第一点一直往下,因为这个时候开始点的纵坐标和终点的横坐标是相同的,所以直接用(i,x-i),i++,来表示当前点的坐标,每个点直接是加sqrt(2)。
至于为什么x要<=199,因为我发现当我x取100的时候,a[70][70]以后的数全部为零了,而我取x<=200的时候,a[1][0]=很长的一段数字。。。所以试了几下最后199没问题,如有大神知道为什么请告诉我。。。不胜感激