แนวคิดสำหรับการท้าทายรหัสนี้ง่าย: ให้เมทริกซ์ของจำนวนเต็มลองเรียงลำดับโดยใช้การเคลื่อนไหวสไตล์ Rubik ซึ่งหมายความว่าคุณสามารถเลือกแถวหรือคอลัมน์เดียวและหมุนองค์ประกอบในทิศทางใดก็ได้:
[1, 3, 2, 4] => [3, 2, 4, 1] (rotate left for rows/up for columns)
[1, 3, 2, 4] => [4, 1, 3, 2] (rotate right for rows/down for columns)
ดังนั้นด้วยเมทริกซ์ของจำนวนเต็มของมิติใด ๆ ให้เรียงลำดับองค์ประกอบโดยใช้การแปลงสไตล์รูบิคเหล่านี้เท่านั้น เมทริกซ์
จะได้รับการพิจารณาให้เรียงลำดับหากองค์ประกอบขององค์ประกอบสอดคล้องกับข้อ จำกัด ต่อไปนี้:
I / O
- อินพุตจะเป็นเมทริกซ์ของจำนวนเต็มบวกที่ไม่มีค่าซ้ำ
- ผลลัพธ์จะเป็นการเคลื่อนไหวที่จำเป็นในการจัดเรียง เช่นนี้ไม่ได้เป็นความท้าทายรหัสกอล์ฟและคุณไม่จำเป็นต้องกังวลเกี่ยวกับความยาวของรูปแบบที่นำเสนอสำหรับทุกการเคลื่อนไหวเป็น
#[UDLR]
ที่#
เป็นจำนวนของแถวหรือคอลัมน์ที่จะย้าย (0 จัดทำดัชนี) และ[UDLR]
เป็นตัวเดียวในการที่ ช่วงที่ระบุว่าการเคลื่อนไหวขึ้น / ลง (สำหรับคอลัมน์) หรือซ้าย / ขวา (สำหรับแถว) ดังนั้น1U
จะหมายถึง "ย้ายคอลัมน์ที่ 1 ขึ้นไป" แต่1R
จะเป็น "เลื่อนแถวที่ 1 ไปทางขวา"1R,1U,0L,2D
การเคลื่อนไหวจะคั่นด้วยเครื่องหมายจุลภาคเพื่อแก้ปัญหาจะได้รับการแสดงเช่นนี้
เกณฑ์การให้คะแนน
การพยายามจัดเรียงเมทริกซ์ด้วยวิธีนี้อาจมีค่าใช้จ่ายสูงเนื่องจากมีการรวมกันของการเคลื่อนไหวที่เป็นไปได้จำนวนมากและยังมีรายการการเคลื่อนไหวที่เป็นไปได้จำนวนมากที่สามารถจัดเรียงได้ดังนั้นเป้าหมายคือการเขียนรหัสที่เรียง N * เมทริกซ์ N ด้านล่าง คะแนนจะมีขนาดใหญ่ที่สุด N ที่คุณสามารถแก้ไขในเวลาที่สมเหตุสมผล1โดยไม่มีข้อผิดพลาด ในกรณีที่เสมอกันไทเบรกเกอร์จะเป็นจำนวนการเคลื่อนที่ในเส้นทางที่คุณพบ (เส้นทางที่สั้นกว่าจะดีกว่า)
ตัวอย่าง: หากผู้ใช้ A ค้นหาโซลูชันสำหรับ N = 5 และ B ค้นหาโซลูชันสำหรับ N = 6 B จะชนะโดยไม่คำนึงถึงความยาวของทั้งสองเส้นทาง หากทั้งคู่หาวิธีแก้ปัญหาสำหรับ N = 6 แต่โซลูชันที่พบโดย A มี 50 ขั้นตอนและโซลูชันของ B มี 60 ขั้นตอน A จะชนะ
คำอธิบายเกี่ยวกับวิธีการทำงานของรหัสของคุณได้รับการสนับสนุนอย่างมากและโปรดโพสต์โซลูชั่นที่พบเพื่อให้เราสามารถทดสอบได้ คุณสามารถใช้Pastebinหรือเครื่องมือที่คล้ายกันได้หากโซลูชันมีขนาดใหญ่เกินไป นอกจากนี้การประมาณเวลาที่โค้ดของคุณใช้ในการค้นหาโซลูชันของคุณจะได้รับการชื่นชม
กรณีทดสอบ
เมทริกต่อไปนี้ ( ลิงก์ Pastebinสำหรับเวอร์ชันที่คัดลอกได้มากขึ้น) ได้ถูกสร้างขึ้นเริ่มต้นจากเมทริกซ์ที่เรียงลำดับแล้วโดย scrambling พวกมันด้วยการเคลื่อนไหว 10K แบบสุ่ม, Rubik-style:
Plaintext Test Cases:
[[8, 5, 6], [11, 10, 1], [3, 15, 13]]
[[21, 10, 12, 16], [17, 6, 22, 14], [8, 5, 19, 26], [13, 24, 3, 1]]
[[1, 13, 8, 16, 5], [9, 40, 21, 26, 22], [11, 24, 14, 39, 28], [32, 19, 37, 3, 10], [30, 17, 36, 7, 34]]
[[34, 21, 40, 22, 35, 41], [18, 33, 31, 30, 12, 43], [19, 11, 39, 24, 28, 23], [44, 1, 36, 5, 38, 45], [14, 17, 9, 16, 13, 26], [8, 3, 47, 6, 25, 4]]
[[20, 36, 17, 1, 15, 50, 18], [72, 67, 34, 10, 32, 3, 55], [42, 43, 9, 6, 30, 61, 39], [28, 41, 54, 27, 23, 5, 70], [48, 13, 25, 12, 46, 58, 63], [52, 37, 8, 45, 33, 14, 68], [59, 65, 56, 73, 60, 64, 22]]
[[85, 56, 52, 75, 89, 44, 41, 68], [27, 15, 87, 91, 32, 37, 39, 73], [6, 7, 64, 19, 99, 78, 46, 16], [42, 21, 63, 100, 4, 1, 72, 13], [11, 97, 30, 93, 28, 40, 3, 36], [50, 70, 25, 80, 58, 9, 60, 84], [54, 96, 17, 29, 43, 34, 23, 35], [77, 61, 82, 48, 2, 94, 38, 66]]
[[56, 79, 90, 61, 71, 122, 110, 31, 55], [11, 44, 28, 4, 85, 1, 30, 6, 18], [84, 43, 38, 66, 113, 24, 96, 20, 102], [75, 68, 5, 88, 80, 98, 35, 100, 77], [13, 21, 64, 108, 10, 60, 114, 40, 23], [47, 2, 73, 106, 82, 32, 120, 26, 36], [53, 93, 69, 104, 54, 19, 111, 117, 62], [17, 27, 8, 87, 33, 49, 15, 58, 116], [95, 112, 57, 118, 91, 51, 42, 65, 45]]
Please ask for more if you solve them all. :-) And many thanks to the people who helped me refine this challenge while in the sandbox.
1 A reasonable amount of time: any amount of time that doesn't undermine our patience while testing your solution. Note that TIO only runs code for 60 seconds, any amount of time over that limit will make us test the code in our machines. Example: my rather inefficient algorithm takes a few milliseconds to solve matrices of order 3x3 and 4x4, but I have just tested it with a 5x5 matrix and it took 317 seconds to solve it (in over 5 million movements, very funny if we consider that the matrix to solve was scrambled only 10K times). I tried to reduce the number of movements to less than 10K but I surrendered after 30 minutes executing the code.
O(input size)
then? For a 5x5 matrix it would O(25)
? That seems to be extremely fast, so I would be very interested to see that algorithm or implementation of yours. EDIT: You do realize we input the 'scrambled' matrix and output the movements, right? Not the other way around.