各位帮忙看看 实在是不知道哪里出错了
  • 板块CF13B Letter A
  • 楼主tcswuzb
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/1/22 20:57
  • 上次更新2023/11/5 04:32:27
查看原帖
各位帮忙看看 实在是不知道哪里出错了
87931
tcswuzb楼主2021/1/22 20:57

CF上提示说存在把"NO"判成"YES"的情况

但是看了看实在是不知道哪里出错了

对拍也不好造数据

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int T;
bool flag;
struct Node
{
	int ax,ay,bx,by;
}e[10];
bool check()
{
	bool flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
	if(e[1].ax==e[2].ax&&e[1].ay==e[2].ay) flag1=1;
	if(e[1].ax==e[2].bx&&e[1].ay==e[2].by) flag2=1;
	if(e[1].bx==e[2].ax&&e[1].by==e[2].ay) flag3=1;
	if(e[1].bx==e[2].bx&&e[1].by==e[2].by) flag4=1;
	if(flag1||flag2||flag3||flag4)//第1.2条线段存在一个端点重合 
	{
		if(flag2) swap(e[2].ax,e[2].bx),swap(e[2].ay,e[2].by);
		if(flag3) swap(e[1].ax,e[1].bx),swap(e[1].ay,e[1].by);
		if(flag4) swap(e[1].ax,e[1].bx),swap(e[1].ay,e[1].by),swap(e[2].ax,e[2].bx),swap(e[2].ay,e[2].by);
		int xx=e[1].bx-e[1].ax,xy=e[1].by-e[1].ay;
		int yx=e[2].bx-e[2].ax,yy=e[2].by-e[2].ay;
		if((xx*yy-xy*yx)!=0&&xx*yx+xy*yy>=0)//二者大于0°小于等于90° 
		{
			int minax=min(e[1].ax,e[1].bx),minay=min(e[1].ay,e[1].by);
			int maxax=max(e[1].ax,e[1].bx),maxay=max(e[1].ay,e[1].by);
			int minbx=min(e[2].ax,e[2].bx),minby=min(e[2].ay,e[2].by);
			int maxbx=max(e[2].ax,e[2].bx),maxby=max(e[2].ay,e[2].by);
			if(e[3].ax>=minax&&e[3].ax<=maxax&&e[3].ay>=minay&&e[3].ay<=maxay&&e[3].bx>=minbx&&e[3].bx<=maxbx&&e[3].by>=minby&&e[3].by<=maxby)
			{//防止出现位于延长线上 
				int nax,nay,nbx,nby,kax,kay,kbx,kby;
				nax=e[3].ax-e[1].ax;nbx=e[1].bx-e[3].ax;
				nay=e[3].ay-e[1].ay;nby=e[1].by-e[3].ay;
				kax=e[3].bx-e[2].ax;kbx=e[2].bx-e[3].bx;
				kay=e[3].by-e[2].ay;kby=e[2].by-e[3].by;
				if(nax*nby==nbx*nay&&kax*kby==kbx*kay)//第3条线段端点分别位于两条线段之上 
				if(4*min(abs(nax),abs(nbx))>=max(abs(nax),abs(nbx))&&4*min(abs(kax),abs(kbx))>=max(abs(kax),abs(kbx))&&4*min(abs(nay),abs(nby))>=max(abs(nay),abs(nby))&&4*min(abs(kay),abs(kby))>=max(abs(kay),abs(kby))) 
				//较小长度与较大长度比值大于1/4 
				flag5=1;
			}
			swap(e[3].ax,e[3].bx);swap(e[3].ay,e[3].by);
			if(e[3].ax>=minax&&e[3].ax<=maxax&&e[3].ay>=minay&&e[3].ay<=maxay&&e[3].bx>=minbx&&e[3].bx<=maxbx&&e[3].by>=minby&&e[3].by<=maxby)
			{
				int nax,nay,nbx,nby,kax,kay,kbx,kby;
				nax=e[3].ax-e[1].ax;nbx=e[1].bx-e[3].ax;
				nay=e[3].ay-e[1].ay;nby=e[1].by-e[3].ay;
				kax=e[3].bx-e[2].ax;kbx=e[2].bx-e[3].bx;
				kay=e[3].by-e[2].ay;kby=e[2].by-e[3].by;
				if(nax*nby==nbx*nay&&kax*kby==kbx*kay)
				if(4*min(abs(nax),abs(nbx))>=max(abs(nax),abs(nbx))&&4*min(abs(kax),abs(kbx))>=max(abs(kax),abs(kbx))&&4*min(abs(nay),abs(nby))>=max(abs(nay),abs(nby))&&4*min(abs(kay),abs(kby))>=max(abs(kay),abs(kby))) 
				flag5=1;
			}
			return flag5;
		}
		else return 0;
	}
	else return 0;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		flag=0;
		for(int i=1;i<=3;++i) scanf("%d%d%d%d",&e[i].ax,&e[i].ay,&e[i].bx,&e[i].by);
		if(check()) flag=1;
		swap(e[3],e[1]); 
		if(check()) flag=1;
		swap(e[3],e[2]);
		if(check()) flag=1;
		puts(flag ? "YES":"NO"); 
	}
	return 0;
}
2021/1/22 20:57
加载中...