อัลกอริทึมสำหรับสร้างเขาวงกต 2d [ปิด]


คำตอบ:


21

มีหลายวิธีในการทำเขาวงกต มีรายชื่อและคำอธิบายมากมายที่นี่: http://www.astrolog.org/labyrnth/algrithm.htm

ฉันคิดว่าฉันใช้สิ่งที่อธิบายภายใต้ "สมบูรณ์แบบ"


ทรัพยากรที่ดีมากอย่างแน่นอนสิ่งที่ฉันกำลังมองหา
jdeseno

รักไซต์นั้นใช้มันเมื่อหลายปีก่อน
zanlok

8

ฉันชอบเขาวงกตที่บาดแผลแน่นซึ่งอัลกอริทึมของ Kruskal สร้างขึ้น

คำอธิบายมาตรฐานของอัลกอริทึมของ Kruskal นั้นไม่เหมาะสมในการที่จะแยกแยะสถานที่ในกราฟจากกลุ่มที่ตั้งในขณะที่อาศัยการใช้ปุนเกี่ยวกับตัวเลือกโครงสร้างข้อมูลซึ่งนำไปสู่ความคลุมเครือของคำอธิบาย ดังนั้นฉันจึงปฏิเสธคำศัพท์ของ Kruskal

ฉันจะใช้ข้อกำหนดต่อไปนี้:

  • กราฟ
    • เขาวงกตเอง
  • ปม
    • ตำแหน่งในเขาวงกต บนเขาวงกตสี่เหลี่ยมนี่คือเซลล์สี่เหลี่ยม
  • ขอบ
    • การเชื่อมต่อระหว่างสองโหนด บนเขาวงกตสี่เหลี่ยมนี่คือแท่งที่มีความยาว 1 แท่ง
  • กลุ่มต้นไม้
    • ชุดของโหนดซึ่งอาจว่างเปล่าเรียงเป็นต้นไม้

และจากนั้นเราจะได้รับ:

  1. สร้างกลุ่มGTGสำหรับกลุ่มกราฟต้นไม้ที่มีกลุ่มต้นไม้
  2. เติมGTGกับกลุ่มต้นไม้หนึ่งต้นที่มีหนึ่งโหนดสำหรับทุกตำแหน่งในเขาวงกตของคุณ
  3. สร้างชุดขอบE
  4. เติมEกับขอบที่ถูกต้องในเขาวงกตของคุณ
  5. ในขณะที่มีมากกว่าหนึ่งกลุ่มในGTGและในขณะที่Eไม่ว่างเปล่า:
  6. เลือกrE edge แบบสุ่มจากE
  7. ระบุจุดสิ้นสุดp1และp2ของrE
  8. ลบrEออกจากE
  9. ตรวจสอบว่ากลุ่มp1และp2 ใดเป็นของ ( p1gและp2gตามลำดับ)
  10. หากp1gและp2gแตกต่างกันให้เข้าร่วมกลุ่มต้นไม้p1gและp2gที่p1 -> p2และเขียนความเป็นเจ้าของกลุ่มทั้งหมดของต้นไม้ต้นหนึ่งไปอีกต้นหนึ่งดังนั้นจึงเข้าร่วมต้นไม้
  11. กลับไปที่ขั้นตอนที่ 5
  12. หากคุณไม่มีขอบเหลือ แต่มีมากกว่าหนึ่งต้นแสดงว่ากราฟไม่ได้เชื่อมต่อหรือมีข้อบกพร่อง
  13. หากคุณมีเพียงต้นเดียวคุณจะมีเขาวงกตที่ไม่มีลูปสมบูรณ์

1
เรามีโครงการ GUI และเราต้องสร้างเขาวงกต 2D แบบสุ่มบน GUI นี่คือสิ่งที่ฉันทำและฉันไม่เคยรู้เลยว่าฉันใช้ Kruskals lol ฉันรู้แน่นอนว่าฉันใช้กราฟ
ไบรอันแฮร์ริงตัน

1

วิกิพีเดียมีทรัพยากรที่ดีในการสร้างเขาวงกต ฉันใช้อัลกอริทึม prims แบบสุ่มกับผลลัพธ์ที่ยอดเยี่ยม อัลกอริทึมการหารดูน่าสนใจ แต่ฉันไม่เคยใช้มันเลย

นี่คือตัวอย่างของวิกิพีเดียเกี่ยวกับเรื่องของที่ทำงาน

รูปภาพของ Wikipedia


1

วิธีหนึ่งที่ง่ายคือทำรายการของกำแพงด้านทิศเหนือและทิศตะวันตกจากนั้นทำการเรียงสับเปลี่ยน ให้แต่ละห้องมีตัวเลข จากนั้นระเบิดผนังด้านใดด้านหนึ่งในรายการตราบใดที่ห้องทั้งสองไม่มีหมายเลขเท่ากันจากนั้นกระจายตัวเลขหนึ่งไปยังอีกห้องหนึ่งด้วยหมายเลขเดียวกัน เดินต่อไปจนกว่าคุณจะหมดกำแพง สิ่งนี้ใช้ได้กับเขาวงกตรูปสี่เหลี่ยมผืนผ้าหรือเขาวงกตอื่น ๆ ที่คุณสามารถให้รายการ "ห้องที่อาจเชื่อมต่อกัน" นอกจากนี้โปรแกรมนี้ค่อนข้างตรงไปตรงมา



1

มีวิ่งดีแม้ว่าที่นี่: https://journal.stuffwithstuff.com/2014/12/21/rooms-and-mazes/

ขั้นตอนพื้นฐานคือ:

  • วางห้อง
  • เติมพื้นที่ว่างด้วยเขาวงกต
  • เชื่อมต่อห้องกับเขาวงกต
  • แกะสลักสิ้นตาย

รหัสที่นี่: https://github.com/munificent/hauberk/blob/db360d9efa714efb6d937c31953ef849c7394a39/lib/src/content/dungeon.dart


0

คุณถามว่าฉันใช้อันไหนดังนั้นฉันจะตอบให้แน่ ผมใช้ซ้ำ Backtracker อัลกอริทึมในเกมเขาวงกตของฉันในrootbeer เกมส์

นี่เป็นหลักฐานว่าฉันใช้อัลกอริทึมโปรดอย่ามองว่ามันเป็นงานโฆษณาของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.