计算几何;
这是我见过评测点最少的(CF)题,如图:
题意
根据题意
判断所给的三条线段是否可以构成一个('A'),(值得注意的是题目给出的第三条边的两个顶点不一定在第一和第二两条线段上)
Idea
于是我们有了以下三个判断程序:
( ext{1.判断是否共线})
inline bool gong(int a,int b,int c,int d,int e,int f){
//判断是否在三点是否共线
if((f-b)*(c-a)==(d-b)*(e-a)) return 1;
return 0;
}
( ext{2.判断是否在0—90之间})
inline bool jia(int x,int y,int a,int b,int c,int d){
//判断两线段的夹角是否在0~90之间
if((a-x)*(c-x)+(b-y)*(d-y)<0) return 0;
return 1;
}
( ext{3.判断分割的线段 长/段<1/4})
inline bool dis(int x,int y,int m,int n,int a,int b){
//判断分割的线段是否 长/短<0.25
if(x!=a) if(a>x){
if((a-x)*5<(m-x)) return 0;
if((a-x)*5>(m-x)*4) return 0;
return 1;
}
else{
if((x-a)*5<(x-m)) return 0;
if((x-a)*5>(x-m)*4) return 0;
return 1;
}
else if(b>y){
if((b-y)*5<(n-y)) return 0;
if((b-y)*5>(n-y)*4) return 0;
return 1;
}
else{
if((y-b)*5<(y-n)) return 0;
if((y-b)*5>(y-n)*4) return 0;
return 1;
}
}
模拟过程如下
for(int i=0;i<2;i++)
for(int j=i+1;j<3;j++){
if(a[i].x==a[j].x&&a[i].y==a[j].y){
x=a[i].x; y=a[i].y;
m=a[i].z; n=a[i].zz;
p=a[j].z; q=a[j].zz;
tot1=i; tot2=j;
}
else if(a[i].x==a[j].z&&a[i].y==a[j].zz){
x=a[i].x; y=a[i].y;
m=a[i].z; n=a[i].zz;
p=a[j].x; q=a[j].y;
tot1=i; tot2=j;
}
else if(a[i].z==a[j].z&&a[i].zz==a[j].zz){
x=a[i].z; y=a[i].zz;
m=a[i].x; n=a[i].y;
p=a[j].x; q=a[j].y;
tot1=i; tot2=j;
}
else if(a[i].z==a[j].x&&a[i].zz==a[j].y){
x=a[i].z; y=a[i].zz;
m=a[i].x; n=a[i].y;
p=a[j].z; q=a[j].zz;
tot1=i; tot2=j;
}
}
Code
没有