Идея этого вызова кода проста: учитывая матрицу целых чисел, давайте разберем ее, применяя движения в стиле Рубика. Это означает, что вы можете выбрать одну строку или столбец и вращать его элементы в любом направлении:
[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 для более копируемой версии) были созданы, начиная с уже отсортированных матриц, путем скремблирования их случайными движениями в стиле Рубика по 10 КБ:
Тестовые случаи в открытом тексте:
[[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]]
Пожалуйста, попросите больше, если вы решите их все. :-) И большое спасибо людям, которые помогли мне решить эту проблему, находясь в песочнице .
1 Разумное количество времени: любое время, которое не подрывает наше терпение при тестировании вашего решения. Обратите внимание, что TIO запускает код только в течение 60 секунд, любое количество времени, превышающее это ограничение, заставит нас протестировать код на наших машинах. Пример: мой довольно неэффективный алгоритм занимает несколько миллисекунд для решения матриц порядка 3x3 и 4x4, но я только что протестировал его с матрицей 5x5, и для его решения потребовалось 317 секунд (более 5 миллионов движений, очень забавно, если учесть, что матрица для решения была взломана только 10K раз). Я пытался уменьшить количество движений до 10K, но я сдался после 30 минут выполнения кода.
O(input size)тогда? Для матрицы 5x5 это было бы O(25)? Это кажется очень быстрым, поэтому мне было бы очень интересно увидеть ваш алгоритм или его реализацию. РЕДАКТИРОВАТЬ: Вы понимаете, что мы вводим «скремблированную» матрицу и выводим движения, верно? А не наоборот.