旋转二维阵列的一部分

时间:2010-08-26 00:39:08

标签: ruby matrix puzzle

我已经阅读了this SO question关于如何多次旋转二维数组,我很好奇如何扩展这种情况以使用二维数组的一部分。我已经考虑过一段时间了,我似乎无法想出一个好的等式。基本上我想要做的就是这样:

1  2  3  4  5  6            13 7  1  4  5  6
7  8  9  10 11 12           14 8  2  10 11 12
13 14 15 16 17 18           15 9  3  16 17 18
19 20 21 22 23 24   ---->   19 20 21 22 23 24
25 26 27 28 29 30           25 26 27 28 29 30
31 32 33 34 35 36           31 32 33 34 35 36

我现在用Ruby写这个,但我并不特别关心这种问题的解决方案是什么语言。我只是好奇你是如何解决这类问题的。

编辑:要添加更多细节,可以执行此操作的函数的基本参数将是这样的

def rotate(array, times=1, x=0, y=0, len=nil)
  ...
end

2 个答案:

答案 0 :(得分:3)

请检查此问题:How do you rotate a two dimensional array?

有一种简单的方法:

2-dim数组,使用

transpose.map &:reverse

答案 1 :(得分:2)

那样的东西?

def rotate a,len,ii=0,jj=0,t=1
    t.times do
        a = a.map.with_index do |line,i|
            line.map.with_index do |e,j|
                (ii...(ii+len))===i && (jj...(jj+len))===j ?
                    a[ii+jj+len-j-1][jj+i-ii] : e
            end
        end
    end
    a
end

t = (1..6).map{|i|(1..6).map{|j|j+6*i-6}}
t.each { |i| p i }

rotate(t,3,2,1).each { |i| p i }
rotate(t,6).each { |i| p i }
rotate(t,3,2,1,4).each { |i| p i }
rotate(t,6,0,0,4).each { |i| p i }
rotate(t,2,2,2,3).each { |i| p i }