杭电2073

此题是一道找规律的问题,只要在找的时候细心一下,轻松ac应该是没问题的!!
此题的规律不止一个,这里我说一下我解题的规律吧!
我分了3步来计算!!
1)如果两个点在一条直线上,那么两点间的坐标满足(x1+y1)==(x2+y2),这时两点间的距
离是s=s1*fabs(x1-x2);
2)如果两点不在一条直线上,并且两点在斜率为(-1)的直线上的距离为:
  {  for(i=(x1+y1);i<(x2+y2);i++)
   s=s+sqrt(i*i+(i+1)*(i+1));   }

3)如果两点不在一条直线上,并且两点在斜率为不为(-1)的直线上的距离为:
   {  for(j=(x1+y1+1);j<(x2+y2);j++)
    s=s+j*s1;  }
祝你成功ac!!呵呵!
对了,此题还应该注意一下,由于输入的两个点的大小不确定,应先判断大小,如果不是
由小到大的顺序,应该先交换一下,这里用到了swap(a,b);函数,在头文件中加入
#include <algorithm>即可!!

#include<iostream>
#include<cmath>
#include <algorithm>
using namespace std;
int main()
{
 int N,x1,y1,x2,y2,i,j;
 double s,s1=sqrt(2);
 cin>>N;
 getchar();
 while(N--)
 {
  cin>>x1>>y1>>x2>>y2;
   if ((x1+y1)>(x2+y2))
        {
            swap(x1, x2);
            swap(y1, y2);
          }
        if((x1+y1)==(x2+y2))
          s=s1*fabs(x1-x2);
  else
  {
           s=(y1+x2)*s1;
         for(i=(x1+y1);i<(x2+y2);i++)
         s=s+sqrt(i*i+(i+1)*(i+1));
         for(j=(x1+y1+1);j<(x2+y2);j++)
         s=s+j*s1;
  }
         printf("%.3lf\n",s);
 }
         return 0;
}
     

原文地址:https://www.cnblogs.com/xiohao/p/2745295.html