我正在寻找类似于“以螺旋)方式[循环,但由内而外而不是由内而外”循环的矩阵。谁能帮我找到一个理想的方法来处理任何大小的矩阵,最好是在Ruby中?
示例:在3x4矩阵中,我想从[0,0]开始向右移动,然后在到达[3,0]时向下移动,在[3,2]处向左移动,依此类推。
[0,0] [1,0] [2,0] [3,0] [0,1] [1,1] [2,1] [3,1] [0,2] [1,2] [2,2] [3,2]
移动顺序如下所示:
0 1 2 3 9 10 11 4 8 7 6 5
输出将是:
[0,0], [1,0], [2,0], [3,0], [3,1], [3,2], [2,2], [1,2], [0,2], [0,1], [1,1], [2,1]
不失一般性,让我们将数组写为:
arr = [ [ 1, 2, 3, 4,], [12, 13, 14, 5,], [11, 16, 15, 6,], [10, 9, 8, 7,] ]
理想的结果是:
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
我将使用一个助手:
def rotate_anticlockwise(arr) arr.map(&:reverse).transpose end
例如:
rotate_anticlockwise(arr) #=> [[4, 5, 6, 7], # [3, 14, 15, 8], # [2, 13, 16, 9], # [1, 12, 11, 10]]
现在,我们可以计算出所需的结果,如下所示:
out = [] a = arr.map(&:dup) while a.any? out.concat(a.shift) a = rotate_anticlockwise(a) end out # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]