原题:http://acm.hdu.edu.cn/showproblem.php?pid=2073
思路:
注意节点的位置并不一定是一前一后,判断前后的方法就是把节点各自xy坐标加起来判断大小即可,每移动一次ans+=sqrt(2)。换行时用勾股定理求即可。
源代码:
#include <cstdio> #include <cmath> int n,a,b,x,y,sum1,sum2; double ans=0; void cal(int a,int b,int x,int y) { int p=a; int q=b; while (1) { if (p==x&&q==y) break; if (q==0) { q=p+1; p=0; ans+=sqrt((q)*(q)+(q-1)*(q-1)); } else { p++; q--; ans+=sqrt(2); } } printf("%.3lf\n",ans); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { ans=0; scanf("%d%d%d%d",&a,&b,&x,&y); sum1=a+b; sum2=x+y; if (sum1>sum2) cal(x,y,a,b); else cal(a,b,x,y); } }