ก่อนอื่นเราสามารถแปลงสี่เหลี่ยมต้นฉบับของคุณเป็นเซลล์ในกริดพื้นฐานของคุณเพื่อให้อินพุตมีความสม่ำเสมอมากขึ้น (ปัญหา rasterizing อย่างมีประสิทธิภาพ)
สิ่งนี้จะช่วยให้เราค้นหาการปรับให้เหมาะสมที่อาจไม่ชัดเจนเมื่อทำงานกับสี่เหลี่ยมต้นฉบับโดยตรงโดยเฉพาะอย่างยิ่งเมื่อมันเกี่ยวข้องกับการแยกหลายสี่เหลี่ยมต้นฉบับเพื่อรวมกันอีกครั้งแตกต่างกัน
ต่อไปเราสามารถหาภูมิภาคที่เชื่อมต่อที่มีสีเดียวกันโดยใช้อัลกอริทึมการค้นหาเชิงลึกหรือการเติมน้ำท่วม เราสามารถพิจารณาแต่ละภูมิภาคเชื่อมต่อ (กpolyomino ) ในการแยก - ไม่มีอะไรที่เราทำเพื่อความต้องการที่แตกต่างกันในภูมิภาคที่มีอิทธิพลต่อคนนี้
อย่างมีประสิทธิภาพเราต้องการหาวิธีที่จะแยก polyomino นี้ออกเป็นรูปสี่เหลี่ยมผืนผ้า (น่าเสียดายที่วรรณกรรมส่วนใหญ่ที่ฉันสามารถหาพบได้คือเกี่ยวกับปัญหาตรงข้าม: การตัดรูปสี่เหลี่ยมลงในรูปหลายเหลี่ยม!
วิธีการหนึ่งที่ตรงไปตรงมาคือการรวมการวิ่งในแนวนอนของสี่เหลี่ยมที่อยู่ติดกันเป็นสี่เหลี่ยมผอมยาว จากนั้นเราสามารถเปรียบเทียบกับแถวด้านบนและรวมกันหากการเริ่มและสิ้นสุดการจับคู่ของเราตรงกัน - ไม่ว่าเราจะเสร็จสิ้นการรัน / แถวแต่ละครั้งหรือเมื่อเราพิจารณาแต่ละเซลล์เพื่อเพิ่มลงในการวิ่งปัจจุบัน
ฉันยังไม่รู้ว่าวิธีการนี้ใกล้จะถึงจุดสูงสุดแล้ว ดูเหมือนว่ามันจะมีปัญหาเล็กน้อยเมื่อแถวที่ยังไม่ได้พิจารณาชี้ให้เห็นว่าแตกต่างจากแถวที่เห็นจนถึงตอนนี้:
การตรวจจับเมื่อการวิ่ง / สี่เหลี่ยมถูกครอบคลุมโดยการวิ่งด้านบน & ด้านล่างจากนั้นการแยกและการรวมพวกมันจะช่วยแก้กรณีนี้โดยเฉพาะ แต่ฉันไม่ได้สำรวจว่าปัญหาทั่วไปเป็นอย่างไร
ฉันได้ดูวิธีการที่เราเดินไปรอบ ๆ โพลีโอมิโนและตัดผ่านทุกครั้งที่เราพบมุมเว้า แต่วิธีนี้ดูผิดพลาดได้ง่ายกว่าสำหรับฉัน การได้ผลลัพธ์ที่ดีที่สุดนั้นต้องการการจัดลำดับความสำคัญการตัดที่รวมมุมเว้าสองมุมและรูปร่างที่มีโพรงต้องมีการจัดการเป็นพิเศษดังนั้นวิธีการสแกนแถวจะมีความได้เปรียบที่เรียบง่าย
อีกวิธีหนึ่งที่ฉันกำลังมองหาคือการเรียกใช้ครั้งแรกที่พบในแถวบนสุดและขยายมันลงเท่าที่คุณสามารถทำได้ จากนั้นทำการวิ่งครั้งแรกในแถวบนสุดของสิ่งที่เหลือ ... สิ่งนี้ทำให้สะดุดกับรูปร่าง T คว่ำ แต่มันก็ไม่เหมาะเช่นกัน
ฉันรู้สึกว่าอาจมีวิธีใช้การเขียนโปรแกรมแบบไดนามิกเพื่อค้นหาการแยกที่ดีที่สุด แต่ฉันยังไม่พบ