호남대학 교 ACM 프로 그래 밍 신 생 컵 대회 (싱크로 나 이 즈 드 게임) C - Do you like Banana?[얼마나]
7237 단어 Algorithm
평면 상의 두 선 세그먼트 의 두 끝 점 은 두 세그먼트 가 교차 하 는 지 여 부 를 결정 하기 위해 주어 집 니 다 (공통 점 이 있 거나 교차 하 는 부분 적 인 일치 가 있 음). 교차 하 는 경우 "예" 를 출력 하고 "아니오" 를 출력 합 니 다. 입력 설명: 첫 번 째 선 은 입력 된 테스트 의 수 를 나타 내 는 T 의 수 입 니 다.(1 <= T <= 1000) For next T line,each line contains 8 numbers , x1,y1,x2,y2,x3,y3,x4, y4. (8-10 ^ < = xi, yi < = 10 ^ 8) (the two endpoints of line 1 are x1, y1, |, x2, y2, and two of the endpoints of line 2 are x3, y3, |, x4, y4)출력 설명: 각 테스트 케이스 의 경우 두 세그먼트 가 교차 하 는 경우 출력 "Yes", else 출력 "No". 예제 1 입력
2, 1, 2, 1, 0, 2, 2. - 1, 1, 1, 0, 1, 1, 출력.
Yes No
문제: 두 선분 이 교차 할 수 있 는 지 를 구하 세 요.
#include
#include
#include
#include
using namespace std;
///----------alg 1------------
struct Point
{
double x, y;
};
bool between(double a, double X0, double X1)
{
double temp1 = a - X0;
double temp2 = a - X1;
if ((temp1<1e-8 && temp2>-1e-8) || (temp2<1e-6 && temp1>-1e-8))
{
return true;
}
else
{
return false;
}
}
// ,
// p1,p2
// p3,p4
bool detectIntersect(Point p1, Point p2, Point p3, Point p4)
{
double line_x, line_y; //
if ((fabs(p1.x - p2.x)<1e-6) && (fabs(p3.x - p4.x)<1e-6))
{
return false;
}
else if ((fabs(p1.x - p2.x)<1e-6)) // p1p2 y
{
if (between(p1.x, p3.x, p4.x))
{
double k = (p4.y - p3.y) / (p4.x - p3.x);
line_x = p1.x;
line_y = k*(line_x - p3.x) + p3.y;
if (between(line_y, p1.y, p2.y))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else if ((fabs(p3.x - p4.x)<1e-6)) // p3p4 y
{
if (between(p3.x, p1.x, p2.x))
{
double k = (p2.y - p1.y) / (p2.x - p1.x);
line_x = p3.x;
line_y = k*(line_x - p2.x) + p2.y;
if (between(line_y, p3.y, p4.y))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
double k1 = (p2.y - p1.y) / (p2.x - p1.x);
double k2 = (p4.y - p3.y) / (p4.x - p3.x);
if (fabs(k1 - k2)<1e-6)
{
return false;
}
else
{
line_x = ((p3.y - p1.y) - (k2*p3.x - k1*p1.x)) / (k1 - k2);
line_y = k1*(line_x - p1.x) + p1.y;
}
if (between(line_x, p1.x, p2.x) && between(line_x, p3.x, p4.x))
{
return true;
}
else
{
return false;
}
}
}
///------------alg 1------------
int main()
{
int T;
scanf("%d", &T);
while (T--) {
double x1, x2, x3, x4;
double y1, y2, y3, y4;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
Point p1, p2, p3, p4;
p1.x = x1, p1.y = y1;
p2.x = x2, p2.y = y2;
p3.x = x3, p3.y = y3;
p4.x = x4, p4.y = y4;
if (detectIntersect(p1, p2, p3, p4)) {
printf("Yes
");
}
else
{
printf("No
");
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
하나의 수조를 깊이가 가장 낮은 두 갈래 나무로 바꾸다문제 정의: Givena sorted(increasing order) array, write an algorithm to create abinary tree with minimal height. 생각: 이 문제는 비...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.