Вращение части двумерного массива - PullRequest
3 голосов
/ 26 августа 2010

Я прочитал этот SO вопрос о том, как многократно вращать двумерный массив, и мне было любопытно, как можно расширить эту ситуацию для работы с частью двумерногомассив.Я думал об этом некоторое время, и я не могу придумать хорошее уравнение.По сути, я хочу сделать что-то вроде этого:

<b>1  2  3</b>  4  5  6            <b>13 7  1</b>  4  5  6
<b>7  8  9</b>  10 11 12           <b>14 8  2</b>  10 11 12
<b>13 14 15</b> 16 17 18           <b>15 9  3</b>  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 ]

3 голосов
/ 27 июня 2013

Проверьте этот вопрос: Как вращать двумерный массив?

есть простой способ:

2-мерный массив, используйте

transpose.map &:reverse

2 голосов
/ 26 августа 2010

Что-то в этом роде?

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 }
...