搞不定了!!!!!!!蛇形矩阵:生成一个按蛇形方式排列自然数1,2,3,4,5,……,N2的 (1<N≤10)阶方阵。例如:输入:N=4          N=7
输出:1   3    4   10          1    3    4   10   11   21   22
      2   5    9   11          2    5    9   12   20   23   34
      6   8   12   15          6    8   13   19   24   33   35
      7   13  14   16          7   14   18   25   32   36   43
                               15   17   26   31   37   42   44
                               16   27   30   38   41   45   48
                               28   29   39   40   46   47   49
哪位仁兄说说编程思想,

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var N,i,j,k:integer;
        UpDown:integer;
        ResultArray:array of array of integer;
        s:string;
    begin
      N:=10;
      setlength(ResultArray,N,N);
      i:=0;
      j:=0;
      k:=0;
      updown:=-1;
      while k<N*(N-1)/2+N do
      begin
        inc(k);
        ResultArray[i,j]:=k;
        i:=i-updown;
        j:=j+updown;
        if j<0 then
        begin
          updown:=1;
          j:=0;
        end;
        if i<0 then
        begin
          updown:=-1;
          i:=0;
        end;
      end;  i:=N-1;
      j:=N-1;
      k:=N*N+1;
      updown:=-1;
      while k>N*(N-1)/2+N do
      begin
        dec(k);
        ResultArray[i,j]:=k;
        i:=i+updown;
        j:=j-updown;
        if j>N-1 then
        begin
          updown:=1;
          j:=N-1;
        end;
        if i>N-1 then
        begin
          updown:=-1;
          i:=N-1;
        end;
      end;  memo1.Lines.Clear;  for i:=0 to N-1 do
      begin
       s:='';
       for j:=0 to N-1 do
        s:=s+' '+inttostr(ResultArray[i,j]);
       memo1.Lines.Add(s)
      end;
    end;
      

  2.   

    //我也写一个玩玩~~
    var
      vPoints: array of array of Integer; //点阵
      vWidth: Integer; //宽度procedure pInit(mWidth: Integer);
    begin
      vWidth := mWidth;
      SetLength(vPoints, mWidth, mWidth);
    end;procedure pCalc;
    var
      vPoint: TPoint; //当前位置
      vOffset: TPoint; //移动趋势
      vNumber: Integer; //当前数值
    begin
      vPoint := Point(0, 0);
      vNumber := 1;
      vOffset := Point(-1, +1); //左下
      repeat
        vPoints[vPoint.X, vPoint.Y] := vNumber;
        if (vPoint.X + vOffset.X < 0) or (vPoint.X + vOffset.X >= vWidth) or
          (vPoint.Y + vOffset.Y < 0) or (vPoint.Y + vOffset.Y >= vWidth) then
        //判断根据移动趋势是否出界
        begin
          if vOffset.X < 0 then //左方向移动,先向下后向右
            if vPoint.Y + 1 < vWidth then
              vPoint.Y := vPoint.Y + 1
            else vPoint.X := vPoint.X + 1
          else //右方向移动,先向下后向左
            if vPoint.X + 1 < vWidth then
              vPoint.X := vPoint.X + 1
            else vPoint.Y := vPoint.Y + 1;      //反向移动
          vOffset.X := -vOffset.X;
          vOffset.Y := -vOffset.Y;
        end else
        begin //如果趋势合理则移动坐标
          vPoint.X := vPoint.X + vOffset.X;
          vPoint.Y := vPoint.Y + vOffset.Y;
        end;
        Inc(vNumber);
      until (vPoint.X < 0) or (vPoint.X >= vWidth) or
        (vPoint.Y < 0) or (vPoint.Y >= vWidth); //如果坐标已经出界
    end;procedure pPrint(mStrings: TStrings);
    var
      I, J: Integer;
      S: string;
    begin
      mStrings.Clear;
      for J := Low(vPoints[0]) to High(vPoints[0]) do
      begin
        S := '';
        for I := Low(vPoints) to High(vPoints) do
          S := S + Format(' %.3d', [vPoints[I, J]]);
        Delete(S, 1, 1);
        mStrings.Add(S);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      pInit(10);
      pCalc;
      pPrint(Memo1.Lines)
    end;-------------------------
    001 003 004 010 011 021 022 036 037 055
    002 005 009 012 020 023 035 038 054 056
    006 008 013 019 024 034 039 053 057 072
    007 014 018 025 033 040 052 058 071 073
    015 017 026 032 041 051 059 070 074 085
    016 027 031 042 050 060 069 075 084 086
    028 030 043 049 061 068 076 083 087 094
    029 044 048 062 067 077 082 088 093 095
    045 047 063 066 078 081 089 092 096 099
    046 064 065 079 080 090 091 097 098 100
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        x :Integer;
        SnakeArray :Array of Array of Integer;
        procedure MakeSnakeArray;
        procedure PrintSnakeArray;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      x := 10;
      SetLength(SnakeArray,x,x);
      MakeSnakeArray;
      PrintSnakeArray;
    end;procedure TForm1.MakeSnakeArray;
    var
      d, i,j,m :Integer;
    begin
      i := 1;
      j := 1;
      m := 1;
      d := 1;
      repeat SnakeArray[i-1 ,j-1]:=m;
        case d of
        1:begin
            i := i+1;
            if j = 1 then d := 2 else d := 4;
          end;
        2:begin
            i := i-1;
            j := j+1;
            if j = x then d := 1
            else if i = 1 then d := 3;
          end;
        3:begin
            j := j+1;
            if i = x then d := 2 else d := 4;
          end;
        4:begin
            i := i+1;
            j := j-1;
            if i = x then d := 3
            else if j = 1 then d := 1;
          end;
        end;
        m := m+1;
      until m> x*x;
    end;procedure TForm1.PrintSnakeArray;
    var
      i,j :Integer;
      s :String;
    begin
      memo1.Lines.Clear;
      for i:=0 to x-1 do
      begin
       s := '';
       for j:=0 to x-1 do
        s := s+' '+inttostr(SnakeArray[i,j]);
       memo1.Lines.Add(s)
      end;
    end;end.
      

  4.   

    看到这个就知道楼主正在读大一,是老师布置的一个作业吧,哈哈,想当年我也作过,用tubo pascal在学校机房作的,在dos上显示出来的。编程思想吗,这个不就是用笔算出这些数字的排列规则么,用数学公式表达出来就OK了阿。