【问题标题】:substitution isn't saved in a matrix替换不保存在矩阵中
【发布时间】:2017-05-08 00:39:04
【问题描述】:

我试图通过逐行转置和旋转元素来将矩阵旋转 90 度,但转置部分,即第一个 i,j 循环,没有得到保存。

def rotate(matrix)

size = matrix.length

for i in 0..size-1
    for j in 0..size-1
      matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    end
end

if size.even?
  for i in 0..size-1
    for j in 0..(size-1)/2
      matrix[i][j], matrix[i][size-1-j] = matrix[i][size-1-j], matrix[i][j]
    end
  end

else
  for i in 0..size-1
    for j in 0..((size-1)/2 + 1)
      matrix[i][j], matrix[i][size-1-j] = matrix[i][size-1-j], matrix[i][j]
    end
  end
end
matrix
end

有人对此有什么解释吗?

【问题讨论】:

  • 您没有使用matrix stdlib 库有什么特别的原因吗?

标签: ruby algorithm matrix transpose substitution


【解决方案1】:

代码不执行任何操作的原因是因为您正在交换每对元素,然后将它们交换回来。

对于每一对 i,j,如果 i 和 j 相同,则交换不会做任何事情,如果它们不同,则该对将遇到两次,一次当 i 大于 j 时,一次当 j 大于比我。例如,当 i = 2 和 j = 3 时,matrix[2][3] 将与 matrix[3][2] 交换,但稍后当 i = 3 和 j = 2 时,它们将再次交换回来。

您可以通过简单的比较测试来解决此问题:

for i in 0..size-1
    for j in 0..size-1
      if i < j
        matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    end
end

【讨论】:

  • 哦,这可以理解!感谢您的帮助!
【解决方案2】:

在我的回答here 中,第一步是构造一个帮助器,以将相等大小的数组的数组(矩阵等效)旋转 90 度(逆时针)。我的解决方案如下。

arr = [[ 1,  2,  3, 4,],
        [12, 13, 14, 5,],
        [11, 16, 15, 6,],
        [10,  9,  8, 7,]]

arr.map(&:reverse).transpose
  #=> [[4, 5, 6, 7],
  #    [3, 14, 15, 8],
  #    [2, 13, 16, 9],
  #    [1, 12, 11, 10]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2020-09-25
    • 2015-04-20
    • 2014-02-11
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多