🏰
«تولید هزارتو» را بزن تا یک هزارتوی تصادفی ساخته شود
درباره هزارتو
دو فاز دارد: ① تولید با Recursive Backtracking — مثل DFS روی گرید، دیوارهای بین خانههای مجاور را کنده هزارتو میسازد. ② حل با BFS — از Start شروع میکند، کوتاهترین مسیر به End را پیدا میکند.
🏗️
تولید
O(R×C)
🔍
حل BFS
O(R×C)
چرا این الگوریتم؟
Recursive Backtracking هزارتوهای perfect میسازد — یعنی همیشه یک مسیر منحصربهفرد بین هر دو نقطه وجود دارد.
maze.py
# ① تولید: Recursive Backtracking
def carve(maze, r, c, visited):
visited[r][c] = True
for dr, dc in shuffle(DIRS):
nr, nc = r+dr, c+dc
if in_bounds(nr,nc) and not visited[nr][nc]:
remove_wall(maze, r,c, nr,nc) # کندن دیوار
carve(maze, nr, nc, visited) # بازگشتی
# ② حل: BFS
def solve(maze, start, end):
queue = deque([start])
prev = {start: None}
while queue:
cur = queue.popleft()
if cur == end:
return reconstruct(prev, end)
for nb in neighbors(maze, cur):
if nb not in prev:
prev[nb] = cur
queue.append(nb)