求算法:输入N( N>5)
 输出图形(N=5) 1  2  3  4   5
16  17 18 19  6
15  24 25 20  7
14  23 22 21  8
13  12 11 10  9

解决方案 »

  1.   

    前面是N>5,后面是N=5,这到底是什么意思呢?
      

  2.   

    Unit1.pas----unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TSingleArray = array of Integer;
      TData        = array of array of Integer;
      TForm1 = class(TForm)
        btn1: TButton;
        edt1: TEdit;
        Label1: TLabel;
        mmo1: TMemo;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure Circle(aBegin, aSize, aLayer, aNum: Integer; var aData: TData);
        function Matrix(aNum: Integer): TData;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }
    { TForm1 }procedure TForm1.Circle(aBegin, aSize, aLayer, aNum: Integer; var aData: TData);
    var
      i: integer;
      vLeft, vRight, vTop, vBottom: TSingleArray;
      procedure InitArray(aFirstNum: Integer; var aArray: TSingleArray);
      var
        i: Integer;
      begin
        for i := Low(aArray) to High(aArray) do
          aArray[i] := aFirstNum + i;
      end;
    begin
      SetLength(vLeft  , aSize);
      InitArray(aBegin , vLeft);  SetLength(vBottom, aSize);
      InitArray(aBegin + aSize - 1      , vBottom);  SetLength(vRight , aSize);
      InitArray(aBegin + (aSize - 1) * 2, vRight);  SetLength(vTop   , aSize);
      InitArray(aBegin + (aSize - 1) * 3, vTop);
      vTop[aSize - 1] := aBegin;  for i := 0 to aSize - 1 do
      begin
        aData[i + aLayer][aLayer]                        := vLeft[i];
        aData[aNum - aLayer - 1][aLayer + i]             := vBottom[i];
        aData[aNum - aLayer - i - 1][aNum - aLayer  - 1] := vRight[i];
        aData[aLayer][aNum - aLayer - i - 1]             := vTop[i];
      end; //end for
    end;function TForm1.Matrix(aNum: Integer): TData;
    var
      vBegin, vLayer, I: integer;
    begin
      SetLength(Result, aNum, aNum);
      I := aNum;
      vBegin := 1;
      vLayer := 0;
      while I > 0 do
      begin
        Circle(vBegin, I, vLayer, aNum, Result);
        Inc(vBegin, (I - 1) * 4);
        Dec(I, 2);
        Inc(vLayer);
      end; //end while
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      Dat: TData;
      i, j: integer;
      S: string;
      Size: integer;
    begin
      if (Edt1.Text = '') then
      begin
        MessageBox(0, '输入矩阵数字。', '错误', MB_OK + MB_ICONWARNING +
          MB_TOPMOST);
        exit;
      end;
      Size := StrToInt(Edt1.Text);
      Dat := Matrix(Size);
      for i := 0 to Size - 1 do
      begin
        S := '';
        for j := 0 to Size - 1 do
        begin
          S := S + IntToStr(Dat[i][j]) + ',';
        end;
        mmo1.Lines.Add(S);
      end;
    end;end.Unit1.dfm---object Form1: TForm1
      Left = 256
      Top = 125
      Width = 355
      Height = 281
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 16
        Top = 224
        Width = 35
        Height = 13
        Caption = '输入N:'
      end
      object mmo1: TMemo
        Left = 16
        Top = 16
        Width = 297
        Height = 193
        TabOrder = 0
      end
      object btn1: TButton
        Left = 240
        Top = 216
        Width = 75
        Height = 25
        Caption = '显示'
        TabOrder = 1
        OnClick = btn1Click
      end
      object edt1: TEdit
        Left = 56
        Top = 224
        Width = 121
        Height = 21
        TabOrder = 2
      end
    end
      

  3.   

    N = 71,24,23,22,21,20,19,
    2,25,40,39,38,37,18,
    3,26,41,48,47,36,17,
    4,27,42,49,46,35,16,
    5,28,43,44,45,34,15,
    6,29,30,31,32,33,14,
    7,8,9,10,11,12,13,N = 81,28,27,26,25,24,23,22,
    2,29,48,47,46,45,44,21,
    3,30,49,60,59,58,43,20,
    4,31,50,61,64,57,42,19,
    5,32,51,62,63,56,41,18,
    6,33,52,53,54,55,40,17,
    7,34,35,36,37,38,39,16,
    8,9,10,11,12,13,14,15,
    N = 91,32,31,30,29,28,27,26,25,
    2,33,56,55,54,53,52,51,24,
    3,34,57,72,71,70,69,50,23,
    4,35,58,73,80,79,68,49,22,
    5,36,59,74,81,78,67,48,21,
    6,37,60,75,76,77,66,47,20,
    7,38,61,62,63,64,65,46,19,
    8,39,40,41,42,43,44,45,18,
    9,10,11,12,13,14,15,16,17,
    N = 101,36,35,34,33,32,31,30,29,28,
    2,37,64,63,62,61,60,59,58,27,
    3,38,65,84,83,82,81,80,57,26,
    4,39,66,85,96,95,94,79,56,25,
    5,40,67,86,97,100,93,78,55,24,
    6,41,68,87,98,99,92,77,54,23,
    7,42,69,88,89,90,91,76,53,22,
    8,43,70,71,72,73,74,75,52,21,
    9,44,45,46,47,48,49,50,51,20,
    10,11,12,13,14,15,16,17,18,19,
      

  4.   

    function Circle(n:Integer):string;
      var aiRec:array of array of Integer;
          iOutputCount,iX,iY,iXInc,iYInc:Integer;
          str:string;
      begin
        SetLength(aiRec,n,n);
        iX:=0;
        iY:=0;
        iXInc:=1;
        iYInc:=0;
        for iOutputCount:=1 to n*n do
        begin
          aiRec[iX,iY]:=iOutputCount;      if (iX+iXInc>6) or (iY+iYInc>6) or (iX+iXInc<0) or (iY+iYInc<0) or 
               (aiRec[iX+iXInc,iY+iYInc]<>0) then
          begin
            case iXInc of
              1:
              begin
                iXInc:=0;
                iYInc:=1;
              end;
              -1:
              begin
                iXInc:=0;
                iYInc:=-1;
              end;
              else
              begin
                case iYInc of
                  1:
                  begin
                    iXInc:=-1;
                    iYInc:=0;
                  end;
                  -1:
                  begin
                    iXInc:=1;
                    iYInc:=0;
                  end;
                end;
              end;
           end;
          end;
          iX:=iX+iXInc;
          iY:=iY+iYInc;
        end;    str:='';
        for iY:=0 to n-1 do
        begin
          for iX:=0 to n-1 do
          begin
            str:=str+Format('%3d',[ aiRec[iX,iY]]);
          end;
          str:=str+#13#10;
        end;
        aiRec:=nil;
        Result:=str;
      end;调用示例:
      Memo1.Text:=Circle(7); 结果: 当n=7
      1  2  3  4  5  6  7
     24 25 26 27 28 29  8
     23 40 41 42 43 30  9
     22 39 48 49 44 31 10
     21 38 47 46 45 32 11
     20 37 36 35 34 33 12
     19 18 17 16 15 14 13另外,队列要对其,你应该把Memo的字体改为宋体。