73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from enum import IntEnum, unique
|
|
from typing import List, Optional, Tuple, Dict
|
|
# IMPORTANT NOTE: DO NOT IMPORT THE ev3dev.ev3 MODULE IN THIS FILE
|
|
|
|
|
|
@unique
|
|
class Direction(IntEnum):
|
|
""" Directions in degrees """
|
|
NORTH = 0
|
|
EAST = 90
|
|
SOUTH = 180
|
|
WEST = 270
|
|
|
|
|
|
# simple alias, no magic here
|
|
Weight = int
|
|
"""
|
|
Weight of a given path (received from the server)
|
|
value: -1 if broken path
|
|
>0 for all other paths
|
|
never 0
|
|
"""
|
|
|
|
|
|
class Planet:
|
|
"""
|
|
Contains the representation of the map and provides certain functions to manipulate it according to the specifications
|
|
"""
|
|
|
|
def __init__(self):
|
|
""" Initializes the data structure """
|
|
self.target = None
|
|
|
|
def add_path(self, start: Tuple[Tuple[int, int], Direction], target: Tuple[Tuple[int, int], Direction], weight: int):
|
|
"""
|
|
Adds a bidirectional path defined between the start and end coordinates to the map and assigns the weight to it
|
|
|
|
example:
|
|
add_path(((0, 3), Direction.NORTH), ((0, 3), Direction.WEST), 1)
|
|
"""
|
|
pass
|
|
|
|
def get_paths(self) -> Dict[Tuple[int, int], Dict[Direction, Tuple[Tuple[int, int], Direction, Weight]]]:
|
|
"""
|
|
Returns all paths
|
|
|
|
example:
|
|
get_paths() returns: {
|
|
(0, 3): {
|
|
Direction.NORTH: ((0, 3), Direction.WEST, 1),
|
|
Direction.EAST: ((1, 3), Direction.WEST, 2)
|
|
},
|
|
(1, 3): {
|
|
Direction.WEST: ((0, 3), Direction.EAST, 2),
|
|
...
|
|
},
|
|
...
|
|
}
|
|
"""
|
|
pass
|
|
|
|
def shortest_path(self, start: Tuple[int, int], target: Tuple[int, int]) -> Optional[List[Tuple[Tuple[int, int], Direction]]]:
|
|
"""
|
|
Returns a shortest path between two nodes
|
|
|
|
examples:
|
|
shortest_path((0,0), (2,2)) returns: [((0, 0), Direction.EAST), ((1, 0), Direction.NORTH)]
|
|
shortest_path((0,0), (1,2)) returns: None
|
|
"""
|
|
pass
|