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