搞不定了!!!!!!!蛇形矩阵:生成一个按蛇形方式排列自然数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 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
哪位仁兄说说编程思想,
解决方案 »
- 锁住屏幕,不接受按键和鼠标操作怎样实现那?
- meta file is invalid是怎么回事?
- AnimationEffectD不能装载到窗体里
- TDataBase连接Sybase的时候,退出程序时产生外部错误
- 急需解决bitblt,高分酬谢
- 在StringGrid中如何实现回车键换到另一个单元格上?
- 关于三层结构中数据显示的问题!有经验的请进!
- 求救,急!急!急!BDE初始化出错
- 关于文件创建和读的代码,这段代码错在哪里?
- 求助:DBLOOKUPCOMBOBOX的问题
- 急!急!急!ADODataSet中有SaveToFile方法,但如果不想直接保存到文件中,而要直接保存到数据流中行不行?
- 用友政务Delphi软件工程师(人数:5)[email protected] 010-82613388-5002 别删好不好
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;
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
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.