ตรวจจับลำดับของโหนดในกริด


12

จากภาพด้านล่างฉันต้องตรวจจับลำดับที่เหมาะสมที่สุดบนกระดาน (เส้นสีเขียว) เส้นสีน้ำเงิน / แดงแสดงได้ แต่ไม่ใช่การเคลื่อนไหวที่ดีที่สุด

นี่คือกฎ:

  1. คุณสามารถย้ายไปที่ไทล์ใด ๆ ที่เหมือนกันและเป็นเพื่อนบ้านของคุณ (เส้นทแยงมุมใช้ได้)
  2. เมื่อคุณเยี่ยมชมไทล์แล้วคุณจะไม่สามารถเยี่ยมชมไทล์ได้อีก

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

ดังนั้นมีอัลกอริทึมที่ฉันสามารถใช้ได้หรือไม่? ฉันกำลังคิดว่าจะเติมน้ำท่วม แต่ก็ไม่เป็นไปตามกฎ # 2

ตามที่ร้องขอนี่คือวิดีโอของการเล่นเกมที่คล้ายกัน http://youtube.com/watch?v=eumnCTG0AE8

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


อาจเป็นเรื่องสำคัญที่จะต้องทราบว่าดาบ 3 อัน / ทองนั้นเป็นไปได้ แต่ฉันไม่ได้รวมไว้ในภาพ

ทำไม 3 ดาบ / ทองจึงเป็นไปได้ คุณต้องการค้นหาเส้นทางทั้งหมดที่มีอย่างน้อย 3 รายการหรือไม่
bummzack

ใช่นั่นคือความคิด

คำตอบ:


6

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

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

    1
1 1 1
    1
    1
    1
    1

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

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

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

หากคุณพบว่าสิ่งนี้ช้าเกินไปให้ดูคำตอบนี้ใน StackOverflow สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเพิ่มประสิทธิภาพ "ปัญหาเส้นทางที่ยาวที่สุด"

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