主题:[原创]蛇形矩阵---抛砖引玉
flyinggoon
[专家分:110] 发布于 2008-05-09 12:27:00
CLS : INPUT m: DIM a(m, m): k = 0
FOR x = 1 TO m ,x为按蛇形前进的路径上的斜线编号
IF x MOD 2 = 0 THEN
th = m: tl = m + 1 - x 'th、tl分别为编号为x的斜线的起始位置坐标
FOR i = 1 TO x '编号为x的斜线上,有x个单元
k = k + 1: a(th, tl) = k: th = th - 1: tl = tl + 1
NEXT i '此for语句是为了往x号斜线经过的单元填数
ELSE '偶数号斜线上,沿箭头方向,行号递减,列号递增
th = m + 1 - x: tl = m
FOR i = 1 TO x
k = k + 1: a(th, tl) = k: th = th + 1: tl = tl - 1
NEXT i
END IF
NEXT x
'以上为右下三角形矩阵范围内的程序,以下为左上角部分,解释几乎相同(略)
FOR x = m - 1 TO 1 STEP -1
IF x MOD 2 = 0 THEN
th = x: tl = 1
FOR i = 1 TO x
k = k + 1: a(th, tl) = k: th = th - 1: tl = tl + 1
NEXT i
ELSE
th = 1: tl = x
FOR i = 1 TO x
k = k + 1: a(th, tl) = k: th = th + 1: tl = tl - 1
NEXT i
END IF
NEXT x
FOR i = 1 TO m
FOR j = 1 TO m
PRINT USING "###"; a(i, j);
NEXT j: PRINT
NEXT i
END
'*****************以上是本人弄懂的n维蛇形方阵的编程,现笔者求以下(h,n)维蛇形矩阵的源程序的详细解释,请同意我与您单独交流。QQ:328353313 ********
----------------------------------------------------------
1 2 6
3 5 7
4 8 12
9 11 13
10 14 15
----------------------------------------------------------
cls:input "h,n:",h,n '以下程序是怎么形成的?突破口在哪里?
dim s(h,n)
xx=1:yy=-1 '此处的xx、yy变量起什么作用?
for i=1 to h*n
x=x+xx
y=y+yy
if x<1 or x>h or y<1 or y>n then swap xx,yy '为何在满足以上条件时交换?为何要交换?
if x>h then
x=h
y=y+2 'x和y为什么是这样的变化规律?
endif
if y>n then
y=n
x=x+2
endif
if x<1 then x=1
if y<1 then y=1
s(x,y)=i
next
for i=1 to h
print
for j=1 to n
print using "###";s(i,j);
next j,i
end
'本程序简捷,且不一定要求是方阵,但我不知道是以什么为突破口的?语句如何解释?请哪位大侠指导为盼!
最后更新于:2008-05-09 12:32:00
回复列表 (共16个回复)
沙发
Mato完整版 [专家分:1270] 发布于 2008-05-09 22:44:00
我最近还在研究如何找到蛇形矩阵的新解法呢,
这里终于找到了,太棒了,这真是送上门的好事。
不过你的程序要变成长方形的怎么办?不会了吧!!
板凳
flyinggoon [专家分:110] 发布于 2008-05-12 12:08:00
实际上,我第一种方法,即传统的分成两部分的方法,只要稍作改编,就可以应付任何形状的蛇形矩阵,而不只是方阵。但传统的方法改编后,语句越来越长,看上去很笨很勉强。
而我上面提供的第二种方法,好象更具有通用性,而且编码很短。只是我不知道他的突破口,编程者是怎么想到用这种方法的。
如果你能研究出来,不妨教教我。QQ:328353313
3 楼
moz [专家分:37620] 发布于 2008-05-12 12:27:00
你丫的,
把我的代码里的 L 改成 N 就成了你的了。
4 楼
moz [专家分:37620] 发布于 2008-05-12 12:38:00
其实我居然还真看不出来那是我的代码,后来想想,谁会像我这样用小写字母写得那么密呢?
input "h,l:",h,l '[color=0000ff]输入行列数[/color]
dim s(h,l) '[color=0000ff]定义数组[/color]
xx=1 '[color=0000ff]正向,行方向标志[/color]
yy=-1 '[color=0000ff]负向,列方向标志[/color]
for i=1 to h*l '[color=0000ff]总格数[/color]
x=x+xx '[color=0000ff]下一行位置[/color]
y=y+yy '[color=0000ff]下一列位置[/color]
if x<1 or x>h or y<1 or y>l then swap xx,yy '[color=0000ff]改变方向[/color]
if x>h then '[color=0000ff]右边出界,跳到下一格[/color]
x=h
y=y+2
endif
if y>l then '[color=0000ff]下边出界,跳到右边一格[/color]
y=l
x=x+2
endif
if x<1 then x=1
if y<1 then y=1
s(x,y)=i '[color=0000ff]改成 h*l-i+1 就可以能顺序倒过来了.[/color]
next
for i=1 to h '[color=0000ff]显示[/color]
print
for j=1 to l
print using "###";s(i,j);
next j,i
5 楼
flyinggoon [专家分:110] 发布于 2008-05-12 15:27:00
1、我任何时间都没说那是我编的。我只是说在网上看到这个方法,但没看懂。
2、之所以把l改成n,是因为l和1太像了,可读性非常差。
3、“你丫的”显得你素质没有我想像中那么高。
4、非常谢谢你的解释,我再努力看看能否看懂。
5、你说的N转M,我正在琢磨,目前暂时被小数部分阻住了,但或许我能侥幸做出来。
6 楼
flyinggoon [专家分:110] 发布于 2008-05-13 15:46:00
'受“牛人”启发,小民不才,学写了如下程序
CLS : INPUT h, n: DIM s(h, n)
xx = 1: yy = 1: x = 0: y = n - 1
FOR i = 1 TO h * n
x = x + xx: y = y + yy
IF x < 1 OR x > h OR y < 1 OR y > n THEN xx = -xx: yy = -yy
IF y > n AND x <= h THEN y = n
IF x < 1 AND y >= 1 THEN x = 1
IF x > h THEN x = h: y = y - 2
IF y < 1 THEN y = 1: x = x + 2
s(x, y) = i
NEXT i
FOR i = 1 TO h
FOR j = 1 TO n: PRINT USING "###"; s(i, j); : NEXT j: PRINT
NEXT i
END
7 楼
flyinggoon [专家分:110] 发布于 2008-05-14 08:37:00
MOZ解释的不错,只是缺少一个关键点:后面的四条if语句,其实是有顺序的。尽管如此,谢谢MOZ的帮助!
8 楼
imjohnzj [专家分:1490] 发布于 2008-10-27 22:26:00
小弟我也写了段代码,特点是:不用数组,直接输出。
Private Sub SnakeRect(wid As Integer)
size = wid * wid
For y = 1 To wid
out = size: Print out;
If y Mod 2 Then size = size - y - y Else size = size - 1
For x = 1 To wid - 1
If wid - y >= x Then _
If x Mod 2 Xor y Mod 2 Then out = out - (x + x) Else out = out - (y + y - 1) Else _
If x Mod 2 Xor y Mod 2 Then out = out - ((wid - y) * 2 + 1) Else out = out - (wid - x) * 2
Print out;
Next x
Print
Next y
End Sub
想了三天才写出的代码。
9 楼
imjohnzj [专家分:1490] 发布于 2008-10-27 22:27:00
另一个特点,省内存。
10 楼
imjohnzj [专家分:1490] 发布于 2008-10-27 22:31:00
SORRY,因为这代码是在VB中调试的。
现在小弟把它改成QB的了。
CLS
INPUT wid
size = wid * wid
FOR Y = 1 To wid
out = size: PRINT out;
IF Y MOD 2 THEN size = size - Y - Y ELSE size = size - 1
FOR X = 1 To wid - 1
IF wid - Y >= X THEN _
IF X MOD 2 XOR Y MOD 2 THEN out = out - (X + X) ELSE out = out - (Y + Y - 1) ELSE _
IF X MOD 2 XOR Y MOD 2 THEN out = out - ((wid - Y) * 2 + 1) ELSE out = out - (wid - X) * 2
PRINT out;
NEXT X
PRINT
NEXT Y
END
我来回复