Ý tưởng cho thử thách mã này rất đơn giản: đưa ra một ma trận các số nguyên, hãy sắp xếp nó bằng cách áp dụng các chuyển động theo kiểu Rubik. Điều này có nghĩa là bạn có thể chọn một hàng hoặc cột đơn và xoay các phần tử của nó theo bất kỳ hướng nào:
[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)
Vì vậy, được đưa ra một ma trận các số nguyên của bất kỳ thứ nguyên nào, sắp xếp các phần tử của nó chỉ áp dụng các phép biến đổi kiểu Rubik này. Một ma trận
sẽ được coi là sắp xếp nếu các yếu tố của nó tuân thủ các hạn chế sau:
Tôi / O
- Đầu vào sẽ là một ma trận các số nguyên dương không có giá trị lặp lại.
- Đầu ra sẽ là các phong trào cần thiết để sắp xếp nó. Vì đây không phải là một thách thức golf mã và bạn không cần phải lo lắng về chiều dài của nó, định dạng đề xuất cho mỗi phong trào là
#[UDLR]
nơi#
là số hàng hoặc cột để di chuyển (0-lập chỉ mục) và[UDLR]
là một nhân vật duy nhất trong đó phạm vi chỉ định nếu chuyển động là Lên / Xuống (đối với cột) hoặc Trái / Phải (đối với hàng). Vì vậy,1U
có nghĩa là "di chuyển cột thứ 1 lên trên" nhưng1R
sẽ là "di chuyển hàng thứ 1 sang phải". Các chuyển động sẽ được phân tách bằng dấu phẩy, vì vậy một giải pháp sẽ được thể hiện như sau :1R,1U,0L,2D
.
Chấm điểm
Cố gắng sắp xếp một ma trận theo cách này có thể tốn kém vì có rất nhiều sự kết hợp có thể di chuyển, và cũng có rất nhiều danh sách các động thái có thể sắp xếp nó, vì vậy mục tiêu là viết một số mã sắp xếp N * N ma trận dưới đây. Điểm số sẽ là kích thước N lớn nhất mà bạn có thể giải quyết trong khoảng thời gian hợp lý 1 mà không có lỗi (kích thước của ma trận được giải quyết càng lớn thì càng tốt). Trong trường hợp hòa, bộ ngắt kết nối sẽ là số lượng chuyển động trong đường dẫn tìm thấy của bạn (đường dẫn càng ngắn thì càng tốt).
Ví dụ: nếu người dùng A tìm thấy giải pháp cho N = 5 và B tìm thấy giải pháp cho N = 6, B sẽ thắng bất kể độ dài của cả hai đường dẫn. Nếu cả hai đều tìm giải pháp cho N = 6 nhưng giải pháp mà A tìm thấy có 50 bước và giải pháp của B có 60 bước thì A thắng.
Giải thích về cách hoạt động của mã của bạn rất được khuyến khích và vui lòng đăng các giải pháp được tìm thấy để chúng tôi có thể kiểm tra chúng . Bạn có thể sử dụng Pastebin hoặc các công cụ tương tự nếu các giải pháp quá lớn. Ngoài ra, ước tính thời gian sử dụng mã của bạn để tìm giải pháp của bạn sẽ được đánh giá cao.
Các trường hợp thử nghiệm
Các ma trận sau ( liên kết Pastebin cho phiên bản dễ sao chép hơn) đã được tạo bắt đầu từ các ma trận đã được sắp xếp bằng cách xáo trộn chúng với các chuyển động ngẫu nhiên, kiểu Rubik 10K:
Các trường hợp kiểm tra bản rõ:
[[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]]
Xin hỏi thêm nếu bạn giải quyết tất cả. :-) Và cảm ơn những người đã giúp tôi tinh chỉnh thử thách này khi ở trong hộp cát .
1 Lượng thời gian hợp lý: bất kỳ khoảng thời gian nào không làm giảm sự kiên nhẫn của chúng tôi trong khi thử nghiệm giải pháp của bạn. Lưu ý rằng TIO chỉ chạy mã trong 60 giây, bất kỳ khoảng thời gian nào vượt quá giới hạn đó sẽ khiến chúng tôi kiểm tra mã trong máy của mình. Ví dụ: thuật toán khá kém hiệu quả của tôi mất vài mili giây để giải các ma trận của thứ tự 3x3 và 4x4, nhưng tôi vừa thử nghiệm nó với ma trận 5x5 và phải mất tới 3,8 giây để giải quyết nó (trong hơn 5 triệu chuyển động, rất buồn cười nếu chúng ta xem xét điều đó ma trận để giải quyết được tranh giành chỉ 10K lần). Tôi đã cố gắng giảm số lượng chuyển động xuống dưới 10K nhưng tôi đã đầu hàng sau 30 phút thực thi mã.
O(input size)
sẽ là bao nhiêu? Đối với ma trận 5x5 thì O(25)
sao? Điều đó dường như là cực kỳ nhanh chóng, vì vậy tôi sẽ rất thích thú khi thấy thuật toán hoặc triển khai của bạn. EDIT: Bạn có nhận ra chúng ta nhập ma trận 'xáo trộn' và xuất các chuyển động, phải không? Không phải hướng ngược lại.