2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 Out-out-control cars
使一个三角形不动,移动另外一个三角形,判断能否相交
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct node
{
double x1, y1;
double x2, y2;
double x3, y3;
}a,b;
double judge(double x, double y, double dx, double dy, double x1, double y1, double x2, double y2)
{
double t, ex, ey, k;
if(x1==x2)
{
if(dx==0)
{
if(x!=x1)
return 0;
t = 0;
}
else
{
t = (x1-x)/dx;
if(t<0)
return 0;
}
if(y1>y2)
swap(y1, y2);
if(y+t*dy<y1 || y+t*dy>y2)
return 0;
return 1;
}
else
{
k = (y1-y2)/(x1-x2);
if(fabs(k*dx-dy)<=1e-8)
{
if((y-y1)!=k*(x-x1))
return 0;
t = 0;
}
else
{
t = (y-y1+k*x1-k*x)/(k*dx-dy);
if(t<0)
return 0;
}
x += t*dx, y += t*dy;
if(x1>x2)
swap(x1, x2);
if(x<x1 || x>x2)
return 0;
return 1;
}
}
int main(void)
{
double T, flag, x, y, dx, dy;
int t = 1;
scanf("%lf", &T);
while(T--)
{
flag = 0;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &a.x1, &a.y1, &a.x2, &a.y2, &a.x3, &a.y3, &dx, &dy);
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &b.x1, &b.y1, &b.x2, &b.y2, &b.x3, &b.y3, &x, &y);
dx -= x, dy -= y;
flag = max(flag, judge(a.x1, a.y1, dx, dy, b.x1, b.y1, b.x2, b.y2));
flag = max(flag, judge(a.x1, a.y1, dx, dy, b.x1, b.y1, b.x3, b.y3));
flag = max(flag, judge(a.x1, a.y1, dx, dy, b.x2, b.y2, b.x3, b.y3));
flag = max(flag, judge(a.x2, a.y2, dx, dy, b.x1, b.y1, b.x2, b.y2));
flag = max(flag, judge(a.x2, a.y2, dx, dy, b.x1, b.y1, b.x3, b.y3));
flag = max(flag, judge(a.x2, a.y2, dx, dy, b.x2, b.y2, b.x3, b.y3));
flag = max(flag, judge(a.x3, a.y3, dx, dy, b.x1, b.y1, b.x2, b.y2));
flag = max(flag, judge(a.x3, a.y3, dx, dy, b.x1, b.y1, b.x3, b.y3));
flag = max(flag, judge(a.x3, a.y3, dx, dy, b.x2, b.y2, b.x3, b.y3));
if(flag==1)
printf("Case #%d: YES\n", t++);
else
printf("Case #%d: NO\n", t++);
}
return 0;
}