我想询问是否有现成的算法,可以满足以下需求:我有一个 m 列 x n 行 的矩阵,共有 m x n 个元素。我想从中心开始给每个元素赋予位置,并按螺旋形旋转,例如对于一个 3x3 的矩阵,我有 9 个元素,定义如下:
5 6 7
4 9 8
3 2 1
或者对于一个 4 x 3 的矩阵,我有 12 个元素,定义如下:
8 9 10 1
7 12 11 2
6 5 4 3
再举一个例子,如果我有一个5x2的矩阵,那么我就定义了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))
再次非常感谢。
(1 2 3)(8 9 4)(7 6 5)
。在这里看看。 - kobik