| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import os, argparse
- def solve_task(lines):
- start = None
- tiles = [[Vertex() for j in range(len(lines[0]))] for i in range(len(lines))]
- for y, line in enumerate(lines):
- for x, char in enumerate(line):
- value = char
- if value == 'S':
- value = 'a'
- elif value == 'E':
- value = 'z'
- start = tiles[y][x]
- tiles[y][x].value = ord(value)
-
- for y, row in enumerate(tiles):
- for x, vert in enumerate(row):
- if x > 0:
- conditional_add_neighbour(vert, tiles[y][x-1])
- if x < (len(row)-1):
- conditional_add_neighbour(vert, tiles[y][x+1])
- if y > 0:
- conditional_add_neighbour(vert, tiles[y-1][x])
- if y < (len(tiles)-1):
- conditional_add_neighbour(vert, tiles[y+1][x])
-
- distance = BFS(start, ord('a'))
- print(f"The shortest path is {distance}")
- def BFS(start, goal_value):
- nodes_to_search = [start]
- start.distance = 0
- while len(nodes_to_search) > 0:
- current_node = nodes_to_search.pop(0)
- if current_node.visited:
- continue
- current_node.visited = True
- if current_node.value == goal_value:
- return current_node.distance
- for n in current_node.neighbours:
- if not n.visited:
- n.distance = current_node.distance + 1
- nodes_to_search.append(n)
- return "No path"
- def conditional_add_neighbour(src, dest):
- if src.value-dest.value <= 1:
- src.add_neighbour(dest)
-
- class Vertex:
- def __init__(self, value = None) -> None:
- self.neighbours = []
- self.value = value
- self.visited = False
- def add_neighbour(self, other_vertex):
- #n = Edge(self, other_vertex)
- self.neighbours.append(other_vertex)
- class Edge:
- def __init__(self, src, dest) -> None:
- self.src = src
- self.dest = dest
- pass
- def read_lines(filename):
- lines = []
- with open(filename) as infile:
- for raw_line in infile:
- line = raw_line.rstrip()
- lines.append(line)
- return lines
- def parse_arguments():
- parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
- parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
- args = parser.parse_args()
- return args
- def main():
- args = parse_arguments()
- lines = read_lines(args.filename)
- solve_task(lines)
- if __name__ == "__main__":
- main()
|