2010-08-26 4 views
3

Я читал 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, в настоящее время, но я не особенно волнует, что язык решение такого рода проблем будет. Мне просто интересно, как бы вы решили решить эту проблему.

Edit: Чтобы добавить еще некоторые специфические особенности, основные параметры для функции, которые могли бы сделать это было бы нечто похожее на эту

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

Что такое 'len' пары для? – Chubas

+1

Я создал параметр 'len', потому что подраздел должен быть квадратом. Итак, в основном, с параметром len', вы заканчиваете квадрат на решетке с координатами: '(x, y, x + len, y + len)' – ashays

ответ

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 } 
+0

Это сработало отлично! Благодарю. Я очень ценю это. – ashays

Смежные вопросы