44 lines
1.0 KiB
Ruby
44 lines
1.0 KiB
Ruby
# Traverse 2D Array in a spiral
|
|
# Set 4 variables to define the outer bounds
|
|
# of the matrix - left, right, top, bottom
|
|
# Set a direction: 0 -> left to right, 1 -> top to bottom,
|
|
# 2 -> right to left, 3 -> bottom to top
|
|
# At each iteration check which direction is set and
|
|
# iterate through those values in the matrix
|
|
# Then increment the outer bound by 1 to show
|
|
# that that area has already been traced
|
|
|
|
def traverse_spiral(matrix)
|
|
l = 0
|
|
r = matrix[0].length - 1
|
|
b = matrix.length - 1
|
|
t = 0
|
|
dir = 0
|
|
|
|
# loop until top bound equals bottom bounds and left bounds equals right
|
|
while t <= b && l <= r
|
|
|
|
if dir == 0
|
|
(l..r).each { |left_index| puts matrix[t][left_index] }
|
|
t += 1
|
|
end
|
|
|
|
if dir == 1
|
|
(t..b).each { |top_col_ind| puts matrix[top_col_ind][r] }
|
|
r -= 1
|
|
end
|
|
|
|
if dir == 2
|
|
r.downto(l) { |right_index| puts matrix[b][right_index] }
|
|
b -= 1
|
|
end
|
|
|
|
if dir == 3
|
|
b.downto(t) { |bot_col_index| puts matrix[bot_col_index][l] }
|
|
l += 1
|
|
end
|
|
|
|
dir = (dir + 1) % 4
|
|
end
|
|
end
|