Miklix

Trình tạo mê cung Recursive Backtracker

Đã xuất bản: lúc 18:18:21 UTC 16 tháng 2, 2025
Cập nhật lần cuối: lúc 09:02:22 UTC 12 tháng 1, 2026

Công cụ tạo mê cung sử dụng thuật toán quay lui đệ quy để tạo ra một mê cung hoàn hảo. Thuật toán này có xu hướng tạo ra các mê cung với các hành lang dài, quanh co và một lối đi rất dài, ngoằn ngoèo.

Trang này được dịch máy từ tiếng Anh để có thể tiếp cận được với nhiều người nhất có thể. Thật không may, dịch máy vẫn chưa phải là công nghệ hoàn thiện, do đó có thể xảy ra lỗi. Nếu bạn thích, bạn có thể xem phiên bản tiếng Anh gốc tại đây:

Recursive Backtracker Maze Generator

Thuật toán quay lui đệ quy thực chất là một thuật toán tìm kiếm theo chiều sâu đa năng. Khi được sử dụng để tạo mê cung, nó được sửa đổi một chút để chọn đường đi ngẫu nhiên, trong khi nếu được sử dụng cho mục đích tìm kiếm thực tế, người ta thường chỉ tìm kiếm từng cấp độ theo thứ tự tuyến tính. Nó có xu hướng tạo ra các mê cung với các hành lang dài, quanh co và một lời giải rất dài, ngoằn ngoèo.

Một mê cung hoàn hảo là một mê cung mà chỉ có đúng một đường đi từ bất kỳ điểm nào trong mê cung đến bất kỳ điểm nào khác. Điều đó có nghĩa là bạn không thể đi vòng tròn, nhưng bạn sẽ thường gặp ngõ cụt, buộc bạn phải quay lại và quay trở lại.

Bản đồ mê cung được tạo ở đây bao gồm một phiên bản mặc định không có bất kỳ vị trí bắt đầu và kết thúc nào, vì vậy bạn có thể tự quyết định: sẽ có một giải pháp từ bất kỳ điểm nào trong mê cung đến bất kỳ điểm nào khác. Nếu bạn muốn có cảm hứng, bạn có thể bật vị trí bắt đầu và kết thúc được đề xuất - và thậm chí xem giải pháp giữa hai điểm đó.


Tạo mê cung mới








Thuật toán quay lui đệ quy là một phương pháp tìm kiếm theo chiều sâu để tạo ra các mê cung hoàn hảo (mê cung không có vòng lặp và chỉ có một đường đi duy nhất giữa bất kỳ hai điểm nào). Nó đơn giản, hiệu quả và tạo ra các mê cung trực quan hấp dẫn với các hành lang dài, quanh co.

Mặc dù tên gọi là vậy, nó không nhất thiết phải được triển khai bằng đệ quy. Nó thường được triển khai theo phương pháp lặp sử dụng hàng đợi LIFO (tức là ngăn xếp). Đối với các mê cung rất lớn, việc sử dụng đệ quy có nhiều khả năng dẫn đến tràn ngăn xếp cuộc gọi, tùy thuộc vào ngôn ngữ lập trình và bộ nhớ khả dụng. Hàng đợi LIFO có thể dễ dàng được điều chỉnh để xử lý lượng dữ liệu lớn, thậm chí lưu trữ hàng đợi trên đĩa hoặc trong cơ sở dữ liệu nếu bộ nhớ khả dụng không đủ.


Cách thức hoạt động

Thuật toán hoạt động bằng cách sử dụng phương pháp tìm kiếm theo chiều sâu dựa trên ngăn xếp. Dưới đây là mô tả từng bước:

  1. Chọn một ô bắt đầu và đánh dấu nó là ô đã được thăm.
  2. Trong khi vẫn còn các ô chưa được thăm: Hãy nhìn vào các ô lân cận chưa được thăm. Nếu có ít nhất một ô lân cận chưa được thăm: Chọn ngẫu nhiên một trong các ô lân cận đó. Loại bỏ bức tường giữa ô hiện tại và ô lân cận đã chọn. Di chuyển đến ô lân cận đã chọn và đánh dấu nó là đã được thăm. Đẩy ô hiện tại vào ngăn xếp. Nếu không còn ô lân cận nào chưa được thăm: Quay lại bằng cách lấy ô cuối cùng ra khỏi ngăn xếp.
  3. Tiếp tục quá trình này cho đến khi ngăn xếp trống.

Một điều thú vị về thuật toán này là nó hoạt động vừa như một công cụ tạo mê cung, vừa như một công cụ giải mê cung. Nếu bạn chạy nó trên một mê cung đã được tạo sẵn và chỉ dừng lại khi đến điểm kết thúc đã định trước, ngăn xếp sẽ chứa lời giải cho mê cung.

Thực ra tôi đang sử dụng hai phiên bản của thuật toán này trên trang web này: một phiên bản dựa trên hàng đợi LIFO để tạo mê cung trên trang này và một phiên bản dựa trên đệ quy để giải mê cung, cũng như các mê cung được tạo ra bởi các thuật toán khác (đó là cách tạo ra các bản đồ có lời giải). Việc có hai phiên bản khác nhau chỉ là để cho vui vì tôi là một người đam mê khoa học và thấy điều đó thú vị, cả hai phiên bản đều có thể hoạt động cho cả hai mục đích ;-)

Đọc thêm

Nếu bạn thích bài viết này, bạn cũng có thể thích những gợi ý sau:


Chia sẻ trên BlueskyChia sẻ trên FacebookChia sẻ trên LinkedInChia sẻ trên TumblrChia sẻ trên XChia sẻ trên LinkedInGhim trên Pinterest

Mikkel Christensen

Về tác giả

Mikkel Christensen
Mikkel là người sáng lập và chủ sở hữu của miklix.com. Ông có hơn 20 năm kinh nghiệm làm lập trình viên máy tính/nhà phát triển phần mềm chuyên nghiệp và hiện đang làm việc toàn thời gian cho một tập đoàn CNTT lớn của Châu Âu. Khi không viết blog, ông dành thời gian rảnh rỗi cho nhiều sở thích, thú vui và hoạt động, có thể được phản ánh ở một mức độ nào đó trong nhiều chủ đề được đề cập trên trang web này.