arrays - 按螺旋顺序打印矩阵

标签 arrays ruby algorithm multidimensional-array

我正在尝试按螺旋顺序(顺时针)打印数组,但我的代码打印不正确。

我的数组是:

a = [
      [2,  4,  6,  8],
      [5,  9, 12, 16],
      [2, 11,  5,  9],
      [3,  2,  1,  8]
    ]

我的解决方案:

def print_circ(arr, row, col)
  t = 0
  b = row - 1
  l = 0
  r = col - 1
  dir = 0
  while t <= b and l <= r do
    if dir == 0
      for i in l..r
        puts arr[t][i]
      end
      t += 1
    end
    if dir == 1
      for i in t..b
        puts arr[i][r]
      end
      r -= 1
    end
    if dir == 2
      for i in r..l
        puts arr[b][i]
      end
      b -= 1
    end
    if dir == 3
      for i in b..t
        puts arr[i][l]
      end
      l += 1
    end
    dir = (dir+1)%4
  end
end

当我运行它时,它不会打印出底部或左侧边缘:

2
4
6
8
16
9
8
9
12
5
11

任何人都可以帮助我了解我的代码有什么问题吗?

最佳答案

您代码中的错误位于 r..lb..t,其中 r 大于 l ,并且 b 大于 t。当您定义从较高整数到较低整数的范围时,该范围实际上是空的。例如:

irb> (0..3).to_a
 => [0, 1, 2, 3]
irb> (3..0).to_a
 => []

要修复向后迭代代码,您可以将 for i in r..l 循环更改为 (l..r).reverse_each do |i| ...结束

关于arrays - 按螺旋顺序打印矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46696795/

相关文章:

arrays - 使用另一个数组调用字典键

javascript - 根据对象数组中的重复值将对象分组

php - 移除顶层数组并将子数组合并为一个

c# - 如何从 C# 解密 ruby​​ 中的 RijandelManaged?

c++ - 构建非循环依赖的最简单、最有效的数据结构是什么?

algorithm - 使用动态数组处理哈希表中的冲突

java - 如何在java中实例化多边形数组

arrays - Ruby 按子元素对数组数组进行排序

ruby - 非网络 Ruby 项目的框架

algorithm - "house coloring with three colors"是NP吗?