求算法:

clare2003 2004-08-11 07:22:22

求算法:

输入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
...全文
112 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lili1 2004-09-09
  • 打赏
  • 举报
回复
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的字体改为宋体。


taoawhitesheep 2004-09-08
  • 打赏
  • 举报
回复
哇!厉害啊!
reallike 2004-09-08
  • 打赏
  • 举报
回复
N = 7

1,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 = 8

1,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 = 9

1,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 = 10

1,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,
reallike 2004-09-08
  • 打赏
  • 举报
回复
我故意捣乱哦。我输出的是逆时针的,你要的是顺时针的。

哈哈,不能白给,你得改改才行。玩笑以下,见谅。
reallike 2004-09-08
  • 打赏
  • 举报
回复
Unit1.pas

----

unit Unit1;

interface

uses
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
minjunw 2004-09-08
  • 打赏
  • 举报
回复
前面是N>5,后面是N=5,这到底是什么意思呢?
reallike 2004-09-08
  • 打赏
  • 举报
回复
来个Python的吧。你要吗?
mqjshanghai 2004-09-08
  • 打赏
  • 举报
回复
这个算法真的没人会吗?
不会吧???
我来想想

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧