N 라인 세그먼트가 수평 또는 수직입니다. 이제 선분 당 총 교차점 수와 교차점 수를 알아야합니다. N은 까지 갈 수 있습니다. 모든 라인 쌍을 검사 해 보았습니다. 대답은 정확하지만 시간을 줄여야합니다.N 라인 교차점 찾기에 걸리는 시간 단축
이using namespace std;
typedef struct Point
{
long long int x;
long long int y;
} ;
bool fun(Point p0, Point p1, Point p2, Point p3)
{
double s1_x, s1_y, s2_x, s2_y;
s1_x = p1.x - p0.x; s1_y = p1.y - p0.y;
s2_x = p3.x - p2.x; s2_y = p3.y - p2.y;
double s, t;
s = (-s1_y * (p0.x - p2.x) + s1_x * (p0.y - p2.y))/(-s2_x * s1_y + s1_x * s2_y);
t = (s2_x * (p0.y - p2.y) - s2_y * (p0.x - p2.x))/(-s2_x * s1_y + s1_x * s2_y);
if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
{
return 1; // Collision detected
}
return 0; // No collision
}
int main()
{
long long int n // number of line segments;
Point p[n],q[n]; // to store end points of line segments
for(long long int i=0;i<n;i++)
{
// line segments is defined by 2 points P(x1,y1) and Q(x2,y2)
p[i].x=x1;
p[i].y=y1;
q[i].x=x2;
q[i].y=y2;
}
for(long long int i=0;i<n-1;i++)
{
for(long long int j=i+1;j<n;j++)
{
if(fun(p[i],q[i],p[j],q[j]))
count++;
}
}
return 0;
}
누군가가이 프로그램의 시간 복잡도를 감소 나를 도울 수 :
여기 내 코드입니까?
수평 또는 수직 인 경우 교차로를 확인하는 것이 임의의 줄보다 훨씬 쉽습니다 (접근 방법 에서처럼). 또한 x/y 좌표로 선을 정렬하여 시작하십시오.그러면 가능한 교차로가 있어야하는 지역을 알 수 있습니다. 더 정교한 접근 방식은 세그먼트 트리 또는 간격 트리를 사용하는 것입니다. –
동일한 교사 또는 경연 대회? http://stackoverflow.com/questions/40570886/c-modified-line-segment-intersection – MBo
[Implementing Hoey Shamos algorithm with C#] (http://stackoverflow.com/q/18512815/2521214) 모두 대답 .. – Spektre