Cách tiếp cận của tôi là sử dụng ít bộ nhớ (theo quan điểm của thời đại Pacman), nhưng bạn chỉ cần tính toán một lần và nó hoạt động cho mọi thiết kế cấp độ (bao gồm cả các bước nhảy).
Nhãn nút một lần
Khi bạn lần đầu tiên tải một cấp độ, hãy gắn nhãn tất cả các nút hang quái vật 0 (biểu thị khoảng cách từ hang ổ). Tiến hành gắn nhãn bên ngoài các nút được kết nối 1, các nút được kết nối với chúng 2, và cứ thế, cho đến khi tất cả các nút được dán nhãn. (lưu ý: điều này thậm chí hoạt động nếu hang ổ có nhiều lối vào)
Tôi giả sử bạn đã có các đối tượng đại diện cho mỗi nút và kết nối với hàng xóm của họ. Mã giả có thể trông giống như thế này:
public void fillMap(List<Node> nodes) { // call passing lairNodes
int i = 0;
while(nodes.count > 0) {
// Label with distance from lair
nodes.labelAll(i++);
// Find connected unlabelled nodes
nodes = nodes
.flatMap(n -> n.neighbours)
.filter(!n.isDistanceAssigned());
}
}
Mắt di chuyển đến hàng xóm với nhãn khoảng cách thấp nhất
Khi tất cả các nút được gắn nhãn, việc định tuyến mắt là tầm thường ... chỉ cần chọn nút lân cận có nhãn khoảng cách thấp nhất (lưu ý: nếu nhiều nút có khoảng cách bằng nhau, thì không vấn đề gì được chọn). Mã giả:
public Node moveEyes(final Node current) {
return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}
Ví dụ được dán nhãn đầy đủ