本文共 1154 字,大约阅读时间需要 3 分钟。
突破口:直接硬肝,设置两个辅助数组,a1[205],a2[205],分别表示图中斜率为-1,和斜率不为-1的线段长度,找出所给两个点所在的线段编号flag1,flag2,再根据一些规律计算就好。
代码如下:
#include#include #include #include #include #include using namespace std;double a1[205],a2[205]; int main(){ int n,i,j; int flag1,flag2; double x1,x2,y1,y2,ans,temp; for(i=0;i<=200;i++) { if(i==0) { a1[i]=0;a2[i]=1; } else { a1[i]=sqrt(2*i*i); a2[i]=sqrt(i*i+(i+1)*(i+1)); } } scanf("%d",&n); while(n--) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); ans=0;//printf("x1%.2lf y1%.2lf x2%.2lf y2%.2lf\n",x1,y1,x2,y2); for(i=0;i<=200;i++) { if(x1!=i) { temp=y1/(x1-i); //注意避免a÷0的情况 if(temp==-1) { flag1=i; break; } } else { if(y1==0) { flag1=i; break; } } } for(i=0;i<=200;i++) { if(x2!=i) { temp=y2/(x2-i); if(temp==-1) { flag2=i; break; } } else { if(y2==0) { flag2=i; break; } } }//printf("f1 %d f2 %d\n",flag1,flag2); if(flag1==flag2) //在同一线段上 { ans=sqrt( (y1-y2)*(y1-y2) + (x1-x2)*(x1-x2) ); } else { if(flag1>flag2) //确保x1,y1在编号小的线段上 { swap(x1,x2); swap(y1,y2); swap(flag1,flag2); } temp=0; for(i=flag1;i
补充:后知后觉,flag1=(long long)(x1+y1);flag2=(long long)(x2+y2);
转载地址:http://vbdci.baihongyu.com/