【发布时间】:2012-01-06 12:02:38
【问题描述】:
我想问是否有一些算法准备好了,让我可以这样做:我有一个矩阵 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 的矩阵我有 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))
再次非常感谢。
【问题讨论】:
-
在我看来,您的算法还没有明确定义。我预计 5x2 矩阵是 ((6 7) (5 8) (4 9) (3 10) (2 1))。
-
我和大卫在一起。为什么1在不同的地方开始?每次都应该是同一个角落。
-
我不懂你的算法。这是不一致的。例如 3x3 的经典螺旋算法应该是:
(1 2 3)(8 9 4)(7 6 5)。 take a look here. -
你好,很可能我没有正确地告诉“螺旋”。这只是为了说明矩阵中的数字被放置设计一个螺旋例如6个数字它从6到1开始:6、5、4、3、2、1。元素6放置在矩阵的中心,并且矩阵的索引从左向右旋转为螺旋形。有这样的结果,如示例。再次原谅我糟糕的英语。如此设置此元素的矩阵将应用于随机数。
-
首先,您可以在这里查看technicalinterviewquestions.net/2009/03/…
标签: algorithm delphi matrix delphi-xe2 spiral