The self-crossing problem in Python

The self-crossing problem is a fascinating challenge in computational geometry, where a sequence of line segments intersects itself. This phenomenon is significant in various applications, such as robotics, computer graphics, and pathfinding algorithms. For example, consider a path defined by the points A, B, C, and D. If segments AB and CD intersect, the path is deemed self-crossing, complicating calculations like area and distance. Understanding this problem is crucial for ensuring accuracy in algorithms that depend on well-defined, non-overlapping paths, thereby enhancing performance in real-world applications like navigation and design.

Problem statement

The self-crossing problem is a programming challenge in which we’re provided with a list of integers called distance on an X-Y plane. We need to determine if the path depicted by this list intersects itself. This distance represents the number of units we travel in our path.

In GPS navigation systems, detecting self-crossing paths can help identify incorrect routes. By applying the self-crossing algorithm, navigation apps can give users more accurate directions.

A path is considered self-crossing if it follows the steps below:

  1. We begin at the coordinates (0,0) and move counter-clockwise.

  2. Travel distance[0] units to the north.

  3. Travel distance[1] units to the west.

  4. Travel distance[2] units to the south.

  5. Travel distance[3] units to the east.

  6. After we’ve finished traveling, if the path crosses itself, it’s self-crossing.

In this problem, we return True if these steps are followed. The slides below illustrate an example of a self-crossing path. In the slides, our distance is (1, 2, 1, 3):

This widget is not supported in dev-mode. Kindly enable it or run using yarn webapp:dev-widgets.

As we can see in the slides above, the path is self-crossing.

Knowledge test

This widget is not supported in dev-mode. Kindly enable it or run using yarn webapp:dev-widgets.

Algorithm

In this problem, we’ll define three helper functions to verify specific self-crossing situations. These helper functions check specific conditions for potential intersection points:

This widget is not supported in dev-mode. Kindly enable it or run using yarn webapp:dev-widgets.
This widget is not supported in dev-mode. Kindly enable it or run using yarn webapp:dev-widgets.

In summary, these functions check if, at any index i, the path is self-crossing by evaluating a specific amount of distances.

Code

The code for this problem can be seen below:

This widget is not supported in dev-mode. Kindly enable it or run using yarn webapp:dev-widgets.

The Python code can be explained as follows:

  • Line 1: The definition of the isSelfCrossing function takes distance (an array of integers) as a parameter.

  • Lines 2–3: The crossedThree helper function, which verifies the following conditions:

    • The current distance at i is greater than or equal to the distance provided three steps back.

    • The previous distance is less than or equal to the distance two steps back.

  • Lines 5–6: The crossedFour helper function, similar to the previous function:

    • The current distance is greater than or equal to the distance provided three steps back.

    • The current distance plus the distance four steps back is greater than or equal to the distance two steps back.

  • Lines 8–9: The crossedFive helper function returns True if the following conditions are met:

    • The index is greater than or equal to 5.

    • The distance two steps back is greater than or equal to the distance four steps back.

    • The sum of the current distance and the distance four steps back is greater than or equal to two steps back.

    • The distance one step back is less than or equal to the distance three steps back.

    • The sum of the distance one step back and five steps back is greater than or equal to the distance three steps back.

  • Lines 11–12: It returns False if the list size is smaller than 4, as a self-crossing pattern is not possible with less than four distances.

  • Lines 14–18: Iterate from the fourth index and call the helper functions. If any of them return True, it is self-crossing.

  • Line 18: If we don’t encounter any self-crossing, return False.

  • Line 20: Calling the function with example values.

Time complexity

The time complexity of the isSelfCrossing function in all implementations is O(n), where n is the length of the distance array. This is because we are iterating through the array once, checking three conditions for each index starting from 3 to n-1.

Space complexity

The space complexity of the function is O(1), as we are using a constant amount of space for variables, regardless of the input size. We don't use any additional data structures that grow with the input; we're only storing a few integer variables and function references.

Free Resources

Copyright ©2026 Educative, Inc. All rights reserved