矩阵和算法"螺旋"

Mar*_*ato 8 delphi algorithm matrix spiral delphi-xe2

我想问一下是否有一些算法准备就绪,这让我做到了这一点:我有一个矩阵m(col)xn(行)和mxn元素.我希望从中心开始给这个元素定位并旋转为螺旋,例如,对于矩阵3x3我有9个元素如此定义:

 5  6  7
 4  9  8
 3  2  1 
Run Code Online (Sandbox Code Playgroud)

或者对于una矩阵4 x 3我有12个元素,定义如下:

  8   9  10  1
  7  12  11  2
  6   5   4  3
Run Code Online (Sandbox Code Playgroud)

或者,矩阵5x2我有10个如此定义的元素:

    3  4
    7  8
   10  9
    6  5 
    2  1
Run Code Online (Sandbox Code Playgroud)

我已经解决了基本上定义mxn元素的整数数组并手动加载值的问题,但是对我来说就像那个自动生成算法的矩阵一样.感谢谁能帮我找到一些东西,非常感谢.

UPDATE

这个代码,我想做的事情,但不是在delphi中; 只是我需要从1开始而不是从0开始.重要的是它对任何matrics mx 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))
Run Code Online (Sandbox Code Playgroud)

再次感谢.

kob*_*bik 4

基于经典的螺旋算法。支持非方阵:

program SpiralMatrix;
{$APPTYPE CONSOLE}
uses
  SysUtils;

type
  TMatrix = array of array of Integer;

procedure PrintMatrix(const a: TMatrix);
var
  i, j: Integer;
begin
  for i := 0 to Length(a) - 1 do
  begin
    for j := 0 to Length(a[0]) - 1 do
      Write(Format('%3d', [a[i, j]]));
    Writeln;
  end;
end;

var
  spiral: TMatrix;
  i, m, n: Integer;
  row, col, dx, dy,
  dirChanges, visits, temp: Integer;
begin
  m := 3; // columns
  n := 3; // rows
  SetLength(spiral, n, m);
  row := 0;
  col := 0;
  dx := 1;
  dy := 0;
  dirChanges := 0;
  visits := m;
  for i := 0 to n * m - 1 do
  begin
    spiral[row, col] := i + 1;
    Dec(visits);
    if visits = 0 then
    begin
      visits := m * (dirChanges mod 2) + n * ((dirChanges + 1) mod 2) - (dirChanges div 2) - 1;
      temp := dx;
      dx := -dy;
      dy := temp;
      Inc(dirChanges);
    end;
    Inc(col, dx);
    Inc(row, dy);
  end;
  PrintMatrix(spiral);
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

3×3:

1  2  3
8  9  4
7  6  5
Run Code Online (Sandbox Code Playgroud)

4×3:

 1  2  3  4
10 11 12  5
 9  8  7  6
Run Code Online (Sandbox Code Playgroud)

2×5:

 1  2
10  3
 9  4
 8  5
 7  6
Run Code Online (Sandbox Code Playgroud)