Skip to content

Commit ed77b76

Browse files
Merge branch 'main' into sudoku
2 parents 65118a5 + 2ad3b7d commit ed77b76

59 files changed

Lines changed: 847 additions & 176 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

projects_registry.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,5 +632,22 @@
632632
"harmonics"
633633
],
634634
"path": "math/Fourier-Series-Visualizer/Fourier-Series-Visualizer.py"
635+
},
636+
{
637+
"name": "Pathfinding Visualizer",
638+
"emoji": "🗺️",
639+
"category": "utilities",
640+
"difficulty": "advanced",
641+
"description": "Visualize Dijkstra's and A* Search algorithms on an interactive grid.",
642+
"keywords": [
643+
"pathfinding",
644+
"visualizer",
645+
"algorithm",
646+
"dijkstra",
647+
"astar",
648+
"grid",
649+
"search"
650+
],
651+
"path": "utilities/Pathfinding-Visualizer/Pathfinding-Visualizer.py"
635652
}
636653
]
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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()
-22.8 KB
-23.1 KB
-18.1 KB
-21.6 KB
-17.9 KB
-31.4 KB
-31.1 KB
-16.6 KB

0 commit comments

Comments
 (0)