Có một danh sách các phòng có kết nối của họ với nhau, làm thế nào để tôi tìm thấy các nhóm phòng bị cô lập?


9

Tôi đang cố gắng tạo ra một roguelike nhỏ và đi xa đến các phòng và hành lang tạo ngẫu nhiên. Mỗi phòng là một đối tượng được điều khiển và chứa một danh sách các phòng khác được kết nối bởi một hành lang.

Tôi có thể chọn ra các phòng không liên kết nhưng làm thế nào tôi có thể biết các phòng chỉ được kết nối với nhau nhưng không phải với hầu hết các phòng khác, tạo thành một hòn đảo?

để minh họa rõ hơn vấn đề ở đây là một hình ảnh từ bàn điều khiển ở mức độ bị sa lầy. Phòng 5 và 6 chỉ được kết nối với nhau. Tôi có thể sử dụng thuật toán nào để phát hiện điều đó?

nhập mô tả hình ảnh ở đây


Vấn đề với việc sử dụng hình ảnh? Liên kết pastebin đó sẽ chỉ kéo dài một tháng.
MichaelHouse

Vâng, ban đầu tôi không hiểu bạn đã làm gì ở đây. Xin lỗi, tôi đã hoàn nguyên sự thay đổi của bạn.
petervaz

1
Tại sao bạn không xây dựng nó để không có bất kỳ phòng riêng biệt nào ở nơi đầu tiên? Hay bạn muốn có những bộ cô lập?
AlbeyAmakiir

@AlbeyAmakiir như tôi đã nói trong một bình luận khác bên dưới, tôi tạo các phòng riêng biệt bằng cách dùng thử và lỗi cho đến khi tôi điền vào bản đồ, chỉ sau đó tôi chạy một thói quen để kết nối, và sau đó sẽ chạy một cái khác để kết nối những hòn đảo đó. Tôi biết nó có thể quá phức tạp nhưng không thể tìm ra cách khác.
petervaz

Câu trả lời:


14

Bắt đầu với một danh sách đầy đủ các phòng. Chọn một phòng bắt đầu. Điều hướng từ phòng đó đến tất cả các phòng được kết nối. Đối với mỗi phòng bạn truy cập, loại bỏ nó khỏi danh sách các phòng và thêm nó vào danh sách Một . Một khi bạn đã truy cập tất cả các kết nối của bạn, bất kỳ phòng còn lại trong danh sách không được kết nối với phòng bắt đầu hoặc bất kỳ phòng trong danh sách Một .

Sau đó, bạn có thể tiếp tục bằng cách chọn một phòng từ phần còn lại của danh sách đầy đủ và điều hướng lại. Lần này thêm vào danh sách B . Tiếp tục quá trình này cho đến khi bạn không còn phòng trong danh sách ban đầu. Bây giờ bạn có danh sách của tất cả các bộ phòng được kết nối.

Các vấn đề như thế này dễ dàng thích nghi với các vấn đề lý thuyết đồ thị. Ví dụ: sự cố bạn đã mô tả ở trên liên quan trực tiếp đến kết nối .


1
bất kỳ thuật toán cây tìm kiếm nên làm việc. Điều đó hoặc bạn có thể thay đổi thuật toán thế hệ của mình để tránh vấn đề này. Nếu bạn thay đổi thuật toán thế hệ của mình, chỉ cần tạo một số phòng ngẫu nhiên được gắn vào phòng bắt đầu của bạn, thì một số phòng ngẫu nhiên được gắn vào mỗi phòng sau đây, sau đó bạn có thể thêm một số kết nối ngẫu nhiên giữa các phòng hiện có để tăng thêm một chút bằng các phím tắt và như vậy. Cá nhân tôi sẽ chỉ làm một thuật toán cây tìm kiếm mặc dù.
Benjamin Danger Johnson

Điều đó rất hợp lý. Tôi phải mệt mỏi. Cảm ơn bạn đã giúp đỡ. Sẽ chấp nhận ngay khi nó cho phép.
petervaz

@BenjaminDangerJohnson Nhận xét của bạn có vẻ phù hợp hơn cho câu hỏi và không phải câu trả lời này.
MichaelHouse

@petervaz Không có vấn đề. Tôi đoán bằng cấp CS của tôi có công dụng của nó sau khi tất cả.
MichaelHouse

@BenjaminDangerJohnson Thuật toán tạo của tôi chỉ là đặt các phòng ngẫu nhiên cho đến khi lấp đầy không gian và tìm kiếm các kết nối sau này. = P Sẽ cố gắng sửa các kết nối trước khi dùng đến thay đổi sáng tạo.
petervaz

9

Bộ sưu tập các phòng của bạn về cơ bản là một biểu đồ và vấn đề của bạn là tìm ra các thành phần được kết nối ("đảo") trong biểu đồ đó.

Một cách đơn giản để tìm các thành phần được kết nối là thực hiện BFS (tìm kiếm theo chiều rộng đầu tiên) từ mỗi đỉnh. Thực hiện BFS từ một đỉnh A sẽ giúp bạn có được tất cả các đỉnh trong thành phần được kết nối mà đỉnh A thuộc về.

Vì vậy, về cơ bản, bạn bắt đầu với một đỉnh tùy ý, thực hiện BFS và đánh dấu mỗi đỉnh gặp phải là thành viên của "đảo" thứ nhất. Sau đó, bạn chuyển sang đỉnh không được đánh dấu tiếp theo và thực hiện lại BFS, lần này ghi nhãn gặp phải các đỉnh là thành viên của "đảo" thứ 2, v.v.


4

Bạn có thể hình dung các phòng như các đỉnh trên biểu đồ có hướng . Bằng cách đó, bạn sẽ có thể áp dụng các thuật toán nổi tiếng để giải quyết vấn đề của mình.

Thuật toán của Dijkstra , ví dụ, tạo ra một cây đường đi ngắn nhất cho một đỉnh bắt đầu nhất định trên biểu đồ. Cây này sẽ chứa tất cả các đỉnh có thể tiếp cận từ điểm bắt đầu. Sau đó, bạn có thể suy luận rằng các đỉnh không có trong cây là một phần của các đảo khác. Bạn có thể áp dụng thuật toán cho các đỉnh này để lấy cây đại diện cho mọi hòn đảo.


1
Ngay cả một đồ thị vô hướng cũng sẽ làm điều đó ... ngoại trừ bạn chỉ có một tuyến đường.
Aron_dc

@Aron_dc, bạn đã đúng, bạn có thể hình dung các phòng dưới dạng các đỉnh trên một biểu đồ không bị ảnh hưởng và nhận được kết quả tương tự bằng cách sử dụng thuật toán của Kruskal. Tôi chỉ đề nghị hình dung nó dưới dạng đồ thị có hướng vì cách petervaz thể hiện các kết nối - tức là Phòng 1> 3
Asakeron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.