这种代码挑战的想法很简单:给定整数矩阵,让我们通过应用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)
因此,给定任意维度的整数矩阵,仅应用这些Rubik样式的转换对其元素进行排序。矩阵
如果其元素符合以下限制,则将被视为已排序:
输入输出
- 输入将是没有重复值的正整数矩阵。
- 输出将是对它进行排序所需的动作。由于这不是高尔夫挑战赛的代码,并且您不必担心它的长度,因此,建议的每次运动格式是要移动的行或列的编号
#[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或类似工具。另外,对您的代码查找解决方案所花费时间的估计将不胜感激。
测试用例
从已经排序的矩阵开始,通过以10K随机,Rubik风格的移动对其进行加扰,创建了以下矩阵(Pastebin链接为可复制粘贴的版本):
明文测试用例:
[[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秒的时间(超过500万次移动,如果考虑解决基质加扰仅 10K次)。我试图将移动次数减少到少于10K,但在执行代码30分钟后就投降了。
O(input size)
多少?对于5x5矩阵,它将是O(25)
什么?这似乎非常快,所以我将非常有兴趣看到您的算法或实现。编辑:您确实意识到我们输入了“加扰”矩阵并输出了运动,对吗?并非相反。