AlgoVerse

مسیریابی در هزارتو (عقبگرد)

از گوشه‌ی بالا-چپ تا گوشه‌ی پایین-راست راه پیدا می‌کند: جلو می‌رود و هر جا بن‌بست بود علامت می‌زند و عقب برمی‌گردد.

هزارتو یک جدول است: 0 خانه‌ی باز و 1 دیوار. از گوشه‌ی بالا-چپ شروع می‌کنیم و به ترتیب راست، پایین، چپ و بالا را امتحان می‌کنیم:

ادامه‌ی توضیح ↓
ورودی:
grid 5×5خروجی PDF

هزارتوی ۵×۵؛ اول شاخه‌ی سمت راست امتحان می‌شود و به بن‌بست می‌رسد (x)، بعد راه پایین تا خروجی می‌رود (o).

  1. def solve_maze(grid):
  2. # 0 is open and 1 is a wall; find a way from the top-left to the bottom-right corner.
  3. rows, cols = len(grid), len(grid[0])
  4. board = [["█" if cell else "·" for cell in row] for row in grid]
  5. if grid[0][0] or grid[rows - 1][cols - 1]:
  6. return False
  7. return walk(board, 0, 0, rows, cols)
  8. def walk(board, r, c, rows, cols):
  9. if r < 0 or r >= rows or c < 0 or c >= cols or board[r][c] != "·":
  10. return False
  11. board[r][c] = "o"
  12. if r == rows - 1 and c == cols - 1:
  13. return True
  14. for dr, dc in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
  15. if walk(board, r + dr, c + dc, rows, cols):
  16. return True
  17. board[r][c] = "x"
  18. return False

ناوردا: خانه‌های o همیشه یک مسیر پیوسته از شروع تا خانه‌ی فعلی‌اند و هر خانه حداکثر یک بار وارد می‌شود.

شروع اجرا

r—
c—

جدول هنوز خالی است.

درخت فراخوانی‌های بازگشتی

نارنجی پر = فراخوانی در حال اجرا · حاشیه‌ی نارنجی = هنوز روی پشته · خاکستری = تمام شده

متغیرهای محلی

نارنجی = در همین گام عوض شد

grid list

[0, 0, 0, 1, 0][1, 1, 0, 1, 0][0, 0, 0, 0, 0][0, 1, 1, 1, 1][0, 0, 0, 0, 0]

Call stack

  1. solve_maze()خط 1
گام ۱ از ۲۳۰
خط سیاه = enter · خط نارنجی = گام کلیدیenter: 0/17 · dead_end: 0/4 · reached: 0/1
    توضیح

    ایده

    هزارتو یک جدول است: 0 خانه‌ی باز و 1 دیوار. از گوشه‌ی بالا-چپ شروع می‌کنیم و به ترتیب راست، پایین، چپ و بالا را امتحان می‌کنیم:

    • اگر خانه‌ی بعدی باز و ندیده باشد، واردش می‌شویم (o).
    • اگر از خانه‌ای هیچ راهی جلو نبود، آن را بن‌بست علامت می‌زنیم (x) و یک خانه عقب برمی‌گردیم.

    این همان جست‌وجوی عمق‌اول روی گراف خانه‌هاست؛ پشته‌ی فراخوانی‌ها همان مسیر فعلی است.

    هزینه

    هر خانه حداکثر یک بار وارد می‌شود: O(سطرها × ستون‌ها). مسیری که پیدا می‌شود لزوماً کوتاه‌ترین نیست؛ برای کوتاه‌ترین باید جست‌وجوی سطح‌اول زد.

    در trace به چه چیزی نگاه کنی

    • جدول همان هزارتوست: █ دیوار، o مسیر فعلی و x بن‌بست‌ها. درخت فراخوانی‌ها شاخه‌های امتحان‌شده را نشان می‌دهد.