เมื่อมีรายการห้องที่เชื่อมต่อกันฉันจะค้นหากลุ่มห้องแยกได้อย่างไร


9

ฉันพยายามที่จะสร้างโร๊คไลค์เล็ก ๆ และออกไปสร้างห้องและทางเดินแบบสุ่ม ห้องพักแต่ละห้องเป็นวัตถุที่ทันสมัยและมีรายการห้องพักอื่น ๆ ที่เชื่อมต่อกันด้วยทางเดิน

ฉันสามารถแยกห้องที่ไม่เชื่อมต่อออกจากกัน แต่ฉันจะรู้ได้อย่างไรว่าห้องที่เชื่อมต่อกันเท่านั้น แต่ไม่ได้รวมกับคนอื่น ๆ ส่วนใหญ่กลายเป็นเกาะ?

เพื่อแสดงให้ดีขึ้นปัญหาที่นี่คือภาพจากคอนโซลในระดับจม ห้องที่ 5 และ 6 เชื่อมต่อกันเท่านั้น ฉันสามารถใช้อัลกอริทึมใดเพื่อตรวจสอบสิ่งนั้น

ป้อนคำอธิบายรูปภาพที่นี่


มีปัญหากับการใช้ภาพหรือไม่ ลิงก์ Pastebin นั้นจะมีอายุเพียงเดือนเดียว
MichaelHouse

ใช่ฉันไม่เข้าใจในตอนแรกที่คุณทำที่นี่ ขออภัยฉันยกเลิกการเปลี่ยนแปลงของคุณแล้ว
petervaz

1
ทำไมคุณไม่สร้างมันเพื่อไม่ให้มีห้องแยกต่างหากในตอนแรก หรือคุณต้องการที่จะมีชุดแยก?
AlbeyAmakiir

@AlbeyAmakiir ตามที่ฉันพูดไว้ในความคิดเห็นอื่นด้านล่างฉันสร้างห้องแยกต่างหากโดยการทดลองและข้อผิดพลาดจนกว่าฉันจะเติมแผนที่เท่านั้นจากนั้นฉันก็รันรูทีนเพื่อเชื่อมต่อแล้วจะวิ่งอีกครั้งเพื่อเชื่อมต่อเกาะเหล่านั้น ฉันรู้ว่ามันอาจจะซับซ้อนเกินไป แต่ก็ไม่สามารถหาวิธีอื่นได้
petervaz

คำตอบ:


14

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

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

ปัญหาเช่นนี้สามารถปรับให้เข้ากับปัญหาทฤษฎีกราฟได้อย่างง่ายดาย ตัวอย่างเช่นปัญหาที่คุณได้อธิบายไว้ข้างต้นโดยตรงที่เกี่ยวข้องกับการเชื่อมต่อ


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

นั่นเป็นเหตุผลมาก ฉันจะต้องเหนื่อย ขอบคุณสำหรับความช่วยเหลือของคุณ. จะยอมรับทันทีที่อนุญาต
petervaz

@BenjaminDangerJohnson ความคิดเห็นของคุณดูเหมาะสมสำหรับคำถามไม่ใช่คำตอบนี้
MichaelHouse

@petervaz ไม่มีปัญหา ฉันคิดว่าระดับปริญญา CS ของฉันมีประโยชน์อยู่บ้าง
MichaelHouse

@BenjaminDangerJohnson อัลกอริทึมการสร้างของฉันเป็นเพียงการวางห้องสุ่มจนกว่าจะเติมพื้นที่และค้นหาการเชื่อมต่อในภายหลัง = P จะพยายามแก้ไขการเชื่อมต่อก่อนที่จะเปลี่ยนการสร้าง
petervaz

9

คอลเลกชันห้องพักของคุณนั้นเป็นกราฟและปัญหาของคุณก็ลดลงเพื่อค้นหาส่วนประกอบที่เชื่อมต่อ ("เกาะ") ในกราฟนั้น

วิธีง่ายๆในการค้นหาส่วนประกอบที่เชื่อมต่อคือการทำBFS (การค้นหาความกว้างแรก) จากจุดสุดยอดแต่ละจุด การทำ BFS จากจุดสุดยอด A จะทำให้คุณได้จุดยอดทั้งหมดในส่วนประกอบที่เชื่อมต่อซึ่งจุดยอด A เป็นของคุณ

โดยพื้นฐานแล้วคุณเริ่มต้นด้วยจุดสุดยอดตามอำเภอใจทำ BFS และทำเครื่องหมายจุดสุดยอดที่พบเป็นสมาชิกของ "เกาะ" แห่งที่ 1 จากนั้นคุณย้ายไปยังจุดสุดยอดที่ไม่มีเครื่องหมายถัดไปและทำ BFS อีกครั้งคราวนี้การติดฉลากจะพบจุดยอดในฐานะสมาชิกของ "เกาะ" อันดับ 2 และอื่น ๆ


4

คุณสามารถถ่ายภาพห้องพักเป็นจุดบนกราฟ คุณจะสามารถใช้อัลกอริทึมที่รู้จักกันดีในการแก้ปัญหาของคุณ

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


1
แม้แต่กราฟที่ไม่ได้บอกทิศทางก็สามารถทำได้ ... ยกเว้นคุณมีเพียงเส้นทางเดียวเท่านั้น
Aron_dc

@Aron_dc คุณพูดถูกคุณสามารถนึกภาพห้องเป็นจุดยอดบนกราฟที่ไม่ได้บอกทิศทางและรับผลลัพธ์ที่คล้ายกันโดยใช้อัลกอริทึมของ Kruskal ฉันแนะนำให้วาดภาพเป็นกราฟกำกับเพราะวิธี petervaz เป็นตัวแทนของการเชื่อมต่อ - เช่นห้องที่ 1> 3
Asakeron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.