ให้แน่ใจว่าเขาวงกตแผนที่บ้านพร้อมลิฟต์สามารถแก้ไขได้หรือไม่


13

ในเกมของฉันเราเห็นพื้นของบ้านจากด้านข้างและฮีโร่สามารถใช้ลิฟท์ได้ - ลิฟท์จะยกขึ้น (ไปที่ลิฟท์ถัดไปขึ้นไป) หรือลง (ขึ้นไปที่ลิฟท์ถัดไป) ขึ้นอยู่กับลูกศร แสดงแล้วและมีลิฟท์สองตัวเชื่อมต่ออยู่เสมอ นั่นเป็นวิธีเดียวที่ฮีโร่สามารถเคลื่อนที่ในแนวตั้งได้แม้ว่าเขาสามารถเคลื่อนที่ในแนวนอนได้อย่างอิสระ แผนที่บ้านเป็นตาราง 11x5 แบบสุ่มที่มีรายการแตกต่างกันและผนังที่ไม่มีใครเทียบได้ไปทางซ้ายสุดทางขวาสุดและบางครั้งอยู่ในตำแหน่งตรงกลางสองตำแหน่ง:

ยกตัวอย่าง

คำถามของฉัน: ฉันจะแน่ใจได้อย่างไรว่าแผนที่จะถูกสุ่ม แต่ยังสามารถแก้ไขได้ตลอดเวลาและฮีโร่ที่เริ่มต้นที่ด้านซ้ายของชั้นล่างสามารถปล่อยให้มันผ่านการยกขึ้นชี้ขึ้นที่ชั้นบนได้อย่างไร

สำหรับสิ่งที่คุ้มค่าฉันกำลังใช้ภาษา Lua เพื่อการพัฒนา ขอบคุณมาก!

คำตอบ:


14

สิ่งที่คุณต้องการทำคือการสร้างกราฟเพื่อให้ทุกโหนดเป็นตำแหน่งลิฟต์และขอบระหว่างพวกเขาหมายความว่าคุณสามารถเดิน / ยกได้ เมื่อคุณสร้างกราฟคุณสามารถใช้ dfs / bfs เพื่อดูว่าคุณจะได้รับจากโหนดเริ่มต้นไปยังโหนดปลาย

การใช้ตัวอย่างของคุณด้านบนฉันทำภาพว่ากราฟมีลักษณะเป็นอย่างไร วงกลมสีเขียวหมายถึงลิฟต์ที่นั่นและเส้นสีเขียวหมายถึงคุณสามารถเดินทางจากโหนดหนึ่งไปยังอีกโหนดหนึ่งได้

โหนด


ขอบคุณมันมีประโยชน์มาก! ฉันควรเน้นย้ำในคำถามของฉันว่าต้องสร้างแผนที่ขึ้นตั้งแต่แรก สิ่งที่ฉันกำลังไตร่ตรองคือถ้ามันอาจไม่ง่าย - แทนที่จะสร้างชุดลิฟท์ / กำแพงแบบสุ่มอย่างสมบูรณ์ซ้ำแล้วซ้ำอีกและตรวจสอบความสามารถในการละลายของพวกเขา - เพื่อให้ได้อัลกอริธึมผ่านบ้านเหมือนฮีโร่ สร้างลิฟท์และประตูแบบสุ่ม (โดยการสุ่มระยะทางลิฟท์และเลี้ยวซ้ายขวาเช่นเดียวกับการเพิ่มผนังเป็นต้น) เช่นเดียวกับใน "เดินไปทางขวาอย่างใดอย่างหนึ่ง 0, 4 หรือ 8 ตาสร้างลิฟท์ขึ้นไปขึ้นจาก 1 ถึง 4 ชั้น ... "
Philipp Lenssen

@PhilippLenssen นั่นคือวิธีการ "ค้นหาความลึกครั้งแรกแบบสุ่ม" เพื่อสร้างเขาวงกตบนกราฟ
Kevin Reid

5

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

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