|
| 1 | +import os |
| 2 | +import time |
| 3 | + |
| 4 | +def clear_screen(): |
| 5 | + os.system('cls' if os.name == 'nt' else 'clear') |
| 6 | + |
| 7 | +def print_grid(grid): |
| 8 | + for row in grid: |
| 9 | + print(" ".join(row)) |
| 10 | + print() |
| 11 | + |
| 12 | +def get_neighbors(node, rows, cols): |
| 13 | + r, c = node |
| 14 | + neighbors = [] |
| 15 | + if r > 0: neighbors.append((r - 1, c)) |
| 16 | + if r < rows - 1: neighbors.append((r + 1, c)) |
| 17 | + if c > 0: neighbors.append((r, c - 1)) |
| 18 | + if c < cols - 1: neighbors.append((r, c + 1)) |
| 19 | + return neighbors |
| 20 | + |
| 21 | +def run_dijkstra(grid, start, end): |
| 22 | + rows, cols = len(grid), len(grid[0]) |
| 23 | + distances = { (r, c): float('inf') for r in range(rows) for c in range(cols) } |
| 24 | + distances[start] = 0 |
| 25 | + previous = { (r, c): None for r in range(rows) for c in range(cols) } |
| 26 | + unvisited = [(r, c) for r in range(rows) for c in range(cols)] |
| 27 | + |
| 28 | + while unvisited: |
| 29 | + unvisited.sort(key=lambda node: distances[node]) |
| 30 | + current = unvisited.pop(0) |
| 31 | + |
| 32 | + if distances[current] == float('inf'): |
| 33 | + break |
| 34 | + |
| 35 | + if grid[current[0]][current[1]] == '█': |
| 36 | + continue |
| 37 | + |
| 38 | + if current == end: |
| 39 | + break |
| 40 | + |
| 41 | + for neighbor in get_neighbors(current, rows, cols): |
| 42 | + if neighbor in unvisited and grid[neighbor[0]][neighbor[1]] != '█': |
| 43 | + alt = distances[current] + 1 |
| 44 | + if alt < distances[neighbor]: |
| 45 | + distances[neighbor] = alt |
| 46 | + previous[neighbor] = current |
| 47 | + |
| 48 | + if neighbor != end and neighbor != start: |
| 49 | + grid[neighbor[0]][neighbor[1]] = '.' |
| 50 | + clear_screen() |
| 51 | + print_grid(grid) |
| 52 | + time.sleep(0.05) |
| 53 | + |
| 54 | + # Reconstruct path |
| 55 | + path = [] |
| 56 | + curr = end |
| 57 | + while previous[curr] is not None: |
| 58 | + path.append(curr) |
| 59 | + curr = previous[curr] |
| 60 | + |
| 61 | + for p in reversed(path): |
| 62 | + if p != end and p != start: |
| 63 | + grid[p[0]][p[1]] = '*' |
| 64 | + clear_screen() |
| 65 | + print_grid(grid) |
| 66 | + time.sleep(0.05) |
| 67 | + |
| 68 | +def main(): |
| 69 | + rows, cols = 10, 20 |
| 70 | + grid = [[' ' for _ in range(cols)] for _ in range(rows)] |
| 71 | + |
| 72 | + start = (1, 1) |
| 73 | + end = (8, 18) |
| 74 | + |
| 75 | + grid[start[0]][start[1]] = 'S' |
| 76 | + grid[end[0]][end[1]] = 'E' |
| 77 | + |
| 78 | + # Add some walls |
| 79 | + for i in range(2, 8): |
| 80 | + grid[i][6] = '█' |
| 81 | + for i in range(1, 7): |
| 82 | + grid[i][12] = '█' |
| 83 | + |
| 84 | + print("🗺️ Pathfinding Visualizer (Terminal Edition)") |
| 85 | + print("S = Start, E = End, █ = Wall, . = Visited, * = Path") |
| 86 | + input("Press Enter to run Dijkstra's Algorithm...") |
| 87 | + |
| 88 | + run_dijkstra(grid, start, end) |
| 89 | + print("Finished Pathfinding!") |
| 90 | + |
| 91 | +if __name__ == "__main__": |
| 92 | + main() |
0 commit comments