Phát hiện một chuỗi các nút trong một lưới


12

Đưa ra hình ảnh dưới đây, tôi cần phát hiện chuỗi tối ưu nhất trên bảng (đường màu xanh lá cây). Các đường màu xanh / đỏ đại diện có thể, nhưng không phải là động thái tốt nhất.

Đây là các quy tắc:

  1. Bạn có thể di chuyển đến bất kỳ ô nào giống nhau và là hàng xóm của bạn (đường chéo là hợp lệ)
  2. Một khi bạn đã truy cập một lát, bạn không thể truy cập lại nó.

Tôi đã nghĩ về việc lặp qua từng nút và nhìn vào các hàng xóm của nó, sau đó đệ quy đi qua. Khi tôi tìm thấy một động thái có thể, tôi có thể đặt nó vào một cấu trúc. Khi tất cả các di chuyển có thể được tìm thấy, tôi chỉ cần chọn di chuyển với số lượng nút cao nhất. Nó trở nên khó khăn hơn khi một nút có nhiều hơn một hàng xóm phù hợp.

Vì vậy, có một số thuật toán mà tôi có thể sử dụng? Tôi đã suy nghĩ một số loại lũ, nhưng điều đó không đáp ứng quy tắc số 2.

Theo yêu cầu, đây là một video của trò chơi tương tự. http://youtube.com/watch?v=eumnCTG0AE8

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


Có thể cần lưu ý rằng 3 thanh kiếm / vàng là phù hợp có thể, nhưng tôi chỉ không đưa chúng vào hình ảnh.

Tại sao 3 thanh kiếm / vàng có thể phù hợp? Bạn có muốn tìm tất cả các đường dẫn bao gồm ít nhất 3 mục không?
bummzack

Vâng, đó là ý tưởng.

Câu trả lời:


6

Bạn có thể xem xét từng nhóm biểu tượng giống hệt nhau được liên kết (và bằng cách liên kết, ý tôi là bạn có thể đi từ biểu tượng này sang biểu tượng khác) một biểu đồ riêng . Đối với mỗi biểu đồ như vậy, áp dụng Tìm kiếm Đầu tiên Độ sâu (DFS) bắt đầu từ mỗi nút trong biểu đồ chưa phải là một phần của đường dẫn dài nhất cho biểu đồ đó . Mỗi khi bạn đi đến ngõ cụt trong khi áp dụng DFS, hãy kiểm tra xem liệu con đường bạn vừa đi qua có dài hơn mức tối đa toàn cầu mà bạn đã tìm thấy cho đến nay không. Nếu có, lưu trữ nó như là con đường dài nhất mới.

Bạn sẽ nhận thấy rằng trong đoạn trước tôi đã đề cập đến việc áp dụng DFS nhiều lần cho mỗi biểu đồ. Một DFS duy nhất chạy trên biểu đồ sẽ không đủ. Hãy xem xét trường hợp cụ thể này:

    1
1 1 1
    1
    1
    1
    1

Nếu tình cờ trước tiên bạn sẽ chạy DFS trên biểu đồ này ở nút trên cùng, bạn sẽ khám phá đường dẫn dài nhất có thể là đường thẳng đứng, nhưng điều đó sẽ không chính xác. Điều này sẽ xảy ra mỗi khi bạn khởi động thuật toán DFS trong một nút nằm ở đâu đó bên trong đường dẫn kết quả hoặc hoàn toàn không phải là một phần của nó. Những gì bạn cần làm trong ví dụ cụ thể này cũng là bắt đầu một thuật toán DFS từ nút ngoài cùng bên trái trong dòng thứ hai. Điều đó sẽ tìm thấy con đường chính xác. Nói chung, bạn sẽ cần chạy các thuật toán DFS trong mỗi nút hiện không phải là một phần của đường dẫn dài nhất cho biểu đồ đó, như đã nêu ở trên.

Kịch bản trường hợp xấu hơn tuyệt đối cho thuật toán này sẽ là một bảng được lấp đầy hoặc chủ yếu chứa đầy một loại ký hiệu duy nhất, tuy nhiên điều đó khó xảy ra trong trò chơi. Ngoài ra, hãy cẩn thận cách bạn lưu trữ các đường dẫn dài nhất cho mỗi biểu đồ. Nếu bạn không tối ưu hóa bit này, bạn có thể tốt hơn nếu chỉ gọi DFS cho mỗi nút trên sân khấu. Giả sử rằng bạn không làm việc với các bảng rất lớn và tốc độ đó không phải là vấn đề lớn, giải pháp này sẽ đủ nhanh.

Về mặt kỹ thuật, bằng cách chia bảng của bạn thành các biểu đồ riêng biệt, bạn sẽ có nhiều " vấn đề về con đường dài nhất ". Như chúng ta có thể thấy từ ví dụ của bạn, bạn có thể có các chu kỳ trong biểu đồ của mình (ví dụ: có tất cả các biểu tượng ở bên ngoài giai đoạn cùng loại), điều đó có nghĩa là trong vấn đề cụ thể này, bạn cần tìm đường đi dài nhất trong một số đồ thị vô hướng theo chu kỳ, không thể thực hiện được trong thời gian đa thức .

Nếu bạn thấy rằng điều này quá chậm, hãy xem câu trả lời này trên StackOverflow để biết thêm chi tiết về cách tối ưu hóa "Vấn đề đường dẫn dài nhất" riêng lẻ.

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.