回 帖 发 新 帖 刷新版面

主题:[原创]蛇形矩阵---抛砖引玉

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
'本程序简捷,且不一定要求是方阵,但我不知道是以什么为突破口的?语句如何解释?请哪位大侠指导为盼!

回复列表 (共16个回复)

沙发

我最近还在研究如何找到蛇形矩阵的新解法呢,

这里终于找到了,太棒了,这真是送上门的好事。

不过你的程序要变成长方形的怎么办?不会了吧!!

板凳

实际上,我第一种方法,即传统的分成两部分的方法,只要稍作改编,就可以应付任何形状的蛇形矩阵,而不只是方阵。但传统的方法改编后,语句越来越长,看上去很笨很勉强。
    而我上面提供的第二种方法,好象更具有通用性,而且编码很短。只是我不知道他的突破口,编程者是怎么想到用这种方法的。
    如果你能研究出来,不妨教教我。QQ:328353313

3 楼

你丫的,
把我的代码里的 L 改成 N 就成了你的了。

4 楼

其实我居然还真看不出来那是我的代码,后来想想,谁会像我这样用小写字母写得那么密呢?

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 楼

1、我任何时间都没说那是我编的。我只是说在网上看到这个方法,但没看懂。
2、之所以把l改成n,是因为l和1太像了,可读性非常差。
3、“你丫的”显得你素质没有我想像中那么高。
4、非常谢谢你的解释,我再努力看看能否看懂。
5、你说的N转M,我正在琢磨,目前暂时被小数部分阻住了,但或许我能侥幸做出来。

6 楼

'受“牛人”启发,小民不才,学写了如下程序
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 楼

MOZ解释的不错,只是缺少一个关键点:后面的四条if语句,其实是有顺序的。尽管如此,谢谢MOZ的帮助!

8 楼

小弟我也写了段代码,特点是:不用数组,直接输出。


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 楼

另一个特点,省内存。

10 楼

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册