a.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import os, argparse
  2. def solve_task(lines):
  3. start = None
  4. goal = None
  5. tiles = [[Vertex() for j in range(len(lines[0]))] for i in range(len(lines))]
  6. for y, line in enumerate(lines):
  7. for x, char in enumerate(line):
  8. value = char
  9. if value == 'S':
  10. value = 'a'
  11. start = tiles[y][x]
  12. elif value == 'E':
  13. value = 'z'
  14. goal = tiles[y][x]
  15. tiles[y][x].value = ord(value)
  16. for y, row in enumerate(tiles):
  17. for x, vert in enumerate(row):
  18. if x > 0:
  19. conditional_add_neighbour(vert, tiles[y][x-1])
  20. if x < (len(row)-1):
  21. conditional_add_neighbour(vert, tiles[y][x+1])
  22. if y > 0:
  23. conditional_add_neighbour(vert, tiles[y-1][x])
  24. if y < (len(tiles)-1):
  25. conditional_add_neighbour(vert, tiles[y+1][x])
  26. distance = BFS(start, goal)
  27. print(f"The shortest path is {distance}")
  28. def BFS(start, goal):
  29. nodes_to_search = [start]
  30. start.distance = 0
  31. while len(nodes_to_search) > 0:
  32. current_node = nodes_to_search.pop(0)
  33. if current_node.visited:
  34. continue
  35. current_node.visited = True
  36. if current_node is goal:
  37. return current_node.distance
  38. for n in current_node.neighbours:
  39. if not n.visited:
  40. n.distance = current_node.distance + 1
  41. nodes_to_search.append(n)
  42. return "No path"
  43. def conditional_add_neighbour(src, dest):
  44. if dest.value <= (src.value + 1):
  45. src.add_neighbour(dest)
  46. class Vertex:
  47. def __init__(self, value = None) -> None:
  48. self.neighbours = []
  49. self.value = value
  50. self.visited = False
  51. def add_neighbour(self, other_vertex):
  52. #n = Edge(self, other_vertex)
  53. self.neighbours.append(other_vertex)
  54. class Edge:
  55. def __init__(self, src, dest) -> None:
  56. self.src = src
  57. self.dest = dest
  58. pass
  59. def read_lines(filename):
  60. lines = []
  61. with open(filename) as infile:
  62. for raw_line in infile:
  63. line = raw_line.rstrip()
  64. lines.append(line)
  65. return lines
  66. def parse_arguments():
  67. parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
  68. parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
  69. args = parser.parse_args()
  70. return args
  71. def main():
  72. args = parse_arguments()
  73. lines = read_lines(args.filename)
  74. solve_task(lines)
  75. if __name__ == "__main__":
  76. main()