一尘不染

循环从外向内循环

algorithm

我正在寻找类似于“以螺旋)方式[循环,但由内而外而不是由内而外”循环的矩阵。谁能帮我找到一个理想的方法来处理任何大小的矩阵,最好是在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]

阅读 215

收藏
2020-07-28

共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]
2020-07-28