蛇形矩阵(Pascal)

wjcking 2005-01-13 02:57:12
搞不定了!!!!!!!

蛇形矩阵:生成一个按蛇形方式排列自然数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
哪位仁兄说说编程思想,
...全文
316 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjcking 2005-01-14
  • 打赏
  • 举报
回复
什么公式,哪伟仁兄能给出思想来?
Allblus 2005-01-13
  • 打赏
  • 举报
回复
看到这个就知道楼主正在读大一,是老师布置的一个作业吧,哈哈,想当年我也作过,用tubo pascal在学校机房作的,在dos上显示出来的。编程思想吗,这个不就是用笔算出这些数字的排列规则么,用数学公式表达出来就OK了阿。
wjcking 2005-01-13
  • 打赏
  • 举报
回复
编程思想!!!!
编程思想!!!!
编程思想!!!!
编程思想!!!!
我要编程思想!!!!
多谢
Kevin_Lmx 2005-01-13
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
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.
王集鹄 2005-01-13
  • 打赏
  • 举报
回复
//我也写一个玩玩~~
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
jinjazz 2005-01-13
  • 打赏
  • 举报
回复
1 3 4 10 11 21 22 36 37 55
2 5 9 12 20 23 35 38 54 56
6 8 13 19 24 34 39 53 57 72
7 14 18 25 33 40 52 58 71 73
15 17 26 32 41 51 59 70 74 85
16 27 31 42 50 60 69 75 84 86
28 30 43 49 61 68 76 83 87 94
29 44 48 62 67 77 82 88 93 95
45 47 63 66 78 81 89 92 96 99
46 64 65 79 80 90 91 97 98 100
jinjazz 2005-01-13
  • 打赏
  • 举报
回复
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;
wjcking 2005-01-13
  • 打赏
  • 举报
回复
up

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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