CF 13B Letter A

计算几何;

这是我见过评测点最少的\(CF\)题,如图:

0.0.1.png

题意

根据题意

判断所给的三条线段是否可以构成一个\('A'\),(值得注意的是题目给出的第三条边的两个顶点不一定在第一和第二两条线段上)

Idea

于是我们有了以下三个判断程序:

\(\text{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;
}

\(\text{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;
}

\(\text{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

没有

posted @ 2019-09-05 17:33  云山乱  阅读(314)  评论(0)    收藏  举报