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