วิธีการของฉันมีความจำน้อยมาก (จากมุมมองของยุค Pacman) แต่คุณต้องคำนวณเพียงครั้งเดียวและใช้งานได้กับการออกแบบทุกระดับ (รวมถึงการกระโดด)
ปมฉลากครั้งเดียว
เมื่อคุณโหลดเลเวลเป็นครั้งแรกให้ติดปมที่ซ่อนรังของมอนสเตอร์ทั้งหมด 0 (แสดงระยะห่างจำกถ้ำ) ดำเนินการต่อเลเบลภายนอกที่เชื่อมต่อโหนด 1, โหนดที่เชื่อมต่อกับพวกเขา 2 และต่อ ๆ ไปจนกระทั่งโหนดทั้งหมดถูกเลเบล (หมายเหตุ: สามารถใช้งานได้หากถ้ำมีทางเข้าหลายทาง)
ฉันสมมติว่าคุณมีวัตถุที่เป็นตัวแทนของแต่ละโหนดและการเชื่อมต่อกับเพื่อนบ้านของพวกเขา โค้ดหลอกอาจมีลักษณะเช่นนี้:
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());
}
}
ตาย้ายไปยังเพื่อนบ้านด้วยฉลากระยะทางที่ต่ำที่สุด
เมื่อโหนดทั้งหมดติดป้ายกำกับการกำหนดเส้นทางตาเป็นเรื่องเล็กน้อย ... เพียงแค่เลือกโหนดใกล้เคียงที่มีป้ายกำกับระยะทางที่ต่ำที่สุด (หมายเหตุ: หากมีหลายโหนดที่มีระยะทางเท่ากัน รหัสหลอก:
public Node moveEyes(final Node current) {
return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}
ตัวอย่างที่ติดฉลากอย่างสมบูรณ์