Матрица и алгоритм «спираль»

Я хотел спросить, готов ли какой-нибудь алгоритм, который позволил бы мне сделать это: у меня есть матрица m (col) x n (row) с m x n элементами. Я хочу задать позицию этому элементу, начиная с центра и вращающегося по спирали, например, для матрицы 3x3 у меня так определено 9 элементов:

 5  6  7
 4  9  8
 3  2  1 

или для una-матрицы 4 x 3 у меня есть 12 элементов, определите:

  8   9  10  1
  7  12  11  2
  6   5   4  3

или, опять же, матрица 5x2 i имеет 10 элементов, определенных таким образом:

    3  4
    7  8
   10  9
    6  5 
    2  1

и т. д. Я решил в основном определить массив целых чисел из m x n элементов и вручную загрузить значение, но в целом мне нравится эта матрица, созданная из алгоритма автоматически. Спасибо, кто может помочь мне что-то найти, большое спасибо.

ОБНОВЛЕНИЕ

Этот код точно соответствует тому, что я хочу иметь, но не в delphi; просто мне нужно, чтобы начало с 1, а не с 0. Для меня важно, что это справедливо для любых матриц m x n. Кто поможет мне перевести это на delphi?

(defun spiral (rows columns)  
  (do ((N (* rows columns))       
    (spiral (make-array (list rows columns) :initial-element nil))      
    (dx 1) (dy 0) (x 0) (y 0)    
   (i 0 (1+ i)))     
 ((= i N) spiral)   
 (setf (aref spiral y x) i)
    (let ((nx (+ x dx)) (ny (+ y dy)))  
    (cond       
       ((and (< -1 nx columns)       
       (< -1 ny rows)           
       (null (aref spiral ny nx)))    
    (setf x nx 
          y ny))  
     (t (psetf dx (- dy)                 
       dy dx)       
    (setf x (+ x dx)             
     y (+ y dy))))))) 


> (pprint (spiral 6 6))

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


> (pprint (spiral 5 3))

#2A  ((0  1 2)
     (11 12 3)
     (10 13 4)
      (9 14 5)
      (8 7 6))

Еще раз большое спасибо.

8
задан Marcello Impastato 6 January 2012 в 22:06
поделиться