1. 程式人生 > >URAL - 1963(幾何)

URAL - 1963(幾何)

clu ring spa algo 對稱軸 names std string style

不知道是不是幾何題,反正就是找對稱,值得註意的是,對稱軸不一定過點,還可能在邊上

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double mm=1e-7;
double x[10],y[10];
bool deng(double a,double b)
{
    return (a-b<mm)&&(b-a<mm);//
精度處理 } bool chuizhi(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)//判斷1,3組成的直線是否和2,4垂直 { return (y3-y1)*(y2-y4)==(x1-x3)*(x2-x4); } bool juli(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)//判斷和點4和點2到由點1和點3組成的直線的距離是否相等 { double a=(y1-y3);
double b=(x3-x1); double c=(y1*b+x1*a)*(-1); double ding=a*x2+b*y2+c; double hehe=fabs(ding);//註意不要除以sqrt(a*a+b*b),因為有可能是0 ding=a*x4+b*y4+c; double haha=fabs(ding); return deng(hehe,haha); } int main() { while(~scanf("%lf%lf",&x[1],&y[1])) { scanf("
%lf%lf%lf%lf%lf%lf",&x[2],&y[2],&x[3],&y[3],&x[4],&y[4]); int ans=0; if(juli(x[1],y[1],x[2],y[2],x[3],y[3],x[4],y[4])&&chuizhi(x[1],y[1],x[2],y[2],x[3],y[3],x[4],y[4])) ans+=2; if(juli(x[2],y[2],x[3],y[3],x[4],y[4],x[1],y[1])&&chuizhi(x[1],y[1],x[2],y[2],x[3],y[3],x[4],y[4])) ans+=2; double mx1,my1,mx2,my2; mx1=(x[1]+x[2])/2.0; my1=(y[1]+y[2])/2.0; mx2=(x[3]+x[4])/2.0; my2=(y[3]+y[4])/2.0; if(chuizhi(x[1],y[1],mx1,my1,x[2],y[2],mx2,my2)&&chuizhi(x[4],y[4],mx2,my2,x[3],y[3],mx1,my1)) ans+=2; mx1=(x[1]+x[4])/2.0; my1=(y[1]+y[4])/2.0; mx2=(x[3]+x[2])/2.0; my2=(y[3]+y[2])/2.0; if(chuizhi(x[4],y[4],mx1,my1,x[1],y[1],mx2,my2)&&chuizhi(x[2],y[2],mx2,my2,x[3],y[3],mx1,my1)) ans+=2; printf("%d\n",ans); } return 0; }

URAL - 1963(幾何)