回 帖 发 新 帖 刷新版面

主题:[讨论]关于螺旋样的图形

晕!今天有个朋友QQ上问我这样的图形! 晕!我对数据结构和算法都不通的!
糊乱搞了一下!写是写出来了!但是确只能打印等长的图形! [em54]


他是这样问的:

--------------------------
编一个螺旋样的图形
     1 12 11 10
     2 13 16  9
     3 14 15  8
     4 5  6   7

---------------------------

晕倒呀!可怜的我没有想到过!!!!! 

我用VB代码写了一个! 感觉好乱! 请各位老鸟看下是否有更好的解决方案!
--------------------------------
    Option Base 1

    Dim Img(5, 5)   As Integer    ' 存款图形数据
    Dim Row         As Integer    ' 图形高
    Dim Col         As Integer    ' 图形长

    Dim Jsq         As Integer
    Dim CS          As Integer    ' 

    Dim I_Row       As Integer    ' 
    Dim I_Col       As Integer

    Dim sRIndex     As Integer
    Dim dRIndex     As Integer
    Dim sCIndex     As Integer
    Dim dCIndex     As Integer
    Dim tempStr     As String

    Row = 5
    Col = 5
    
    sRIndex = 1
    sCIndex = 1
    dRIndex = Row
    dCIndex = Col
    Do While CS <= Int(Row / 2) + (Row Mod 2)

        CS = CS + 1
        
        I_Row = sRIndex
        Do While I_Row <= dRIndex - 1
            Jsq = Jsq + 1
            Img(I_Row, sCIndex) = Jsq
            I_Row = I_Row + 1
        Loop
        I_Col = sCIndex
        Do While I_Col <= dCIndex - 1
            Jsq = Jsq + 1
            Img(dCIndex, I_Col) = Jsq
            I_Col = I_Col + 1
        Loop
        I_Row = dRIndex
        Do While I_Row >= sRIndex + 1
            Jsq = Jsq + 1
            Img(I_Row, dCIndex) = Jsq
            I_Row = I_Row - 1
        Loop
        I_Col = dCIndex
        Do While I_Col >= sCIndex + 1
            Jsq = Jsq + 1
            Img(sRIndex, I_Col) = Jsq
            I_Col = I_Col - 1
        Loop
        
        If sRIndex = Int(Row / 2) + (Row Mod 2) And (Row Mod 2) = 1 Then
            Jsq = Jsq + 1
            Img(sRIndex, sRIndex) = Jsq
        End If
        
        sRIndex = sRIndex + 1
        sCIndex = sCIndex + 1
        dRIndex = dRIndex - 1
        dCIndex = dCIndex - 1
    Loop
    tempStr = ""
    For I_Col = 1 To Col Step 1
        For I_Row = 1 To Row Step 1
            tempStr = tempStr & CStr(Img(I_Col, I_Row)) & String(Len(Str(CInt(Col * Row))) - Len(CStr(Img(I_Col, I_Row))), Chr(32))
        Next
        tempStr = tempStr & Chr(13) & Chr(10)
    Next
    MsgBox tempStr

-----------------------------------------------
请把你知道的算法写下来!

回复列表 (共8个回复)

沙发

旧贴里有很多,
[url=http://www.programfan.com/club/showbbs.asp?id=119249]我的作业本第八题[/url]

板凳

    Dim Img(2, 3)   As Integer  ' Images array
    Dim Row         As Integer  ' rows
    Dim Col         As Integer  ' cols
    Dim Jsq         As Integer  ' temp
    Dim CS          As Integer  ' temp
    Dim X1          As Integer  ' left layer
    Dim X2          As Integer  ' right layer
    Dim Y1          As Integer  ' top layer
    Dim Y2          As Integer  ' bottom layer
    Dim tempStr     As String   ' temp
    Dim Index       As Integer  ' temp
    Dim SS          As Integer
    
    Row = 2
    Col = 3
    
    X1 = 1
    Y1 = 1
    X2 = Col
    Y2 = Row
    If Row < Col Then
        SS = Int(Row / 2) + (Row Mod 2)
    Else
        SS = Int(Col / 2) + (Col Mod 2)
    End If
    
    Do While CS <= SS
        CS = CS + 1
        ' ==================
        ' left
        ' ==================
        If X1 <= X2 Then
            For Index = Y1 To Y2
                Jsq = Jsq + 1
                Img(Index, X1) = Jsq
            Next
            X1 = X1 + 1
        End If
        ' ==================
        ' bottom
        ' ==================
        If Y1 <= Y2 Then
            For Index = X1 To X2
                Jsq = Jsq + 1
                Img(Y2, Index) = Jsq
            Next
            Y2 = Y2 - 1
        End If
        ' ==================
        ' right
        ' ==================
        If X2 >= X1 Then
            For Index = Y2 To Y1 Step -1
                Jsq = Jsq + 1
                Img(Index, X2) = Jsq
            Next
            X2 = X2 - 1
        End If
        ' ==================
        ' top
        ' ==================
        If Y2 >= Y1 Then
            For Index = X2 To X1 Step -1
                Jsq = Jsq + 1
                Img(Y1, Index) = Jsq
            Next
            Y1 = Y1 + 1
        End If
    Loop
    
    Dim I_COL As Integer
    Dim I_ROW As Integer
    tempStr = ""
    For I_ROW = 1 To Row Step 1
        For I_COL = 1 To Col Step 1
            tempStr = tempStr & CStr(Img(I_ROW, I_COL)) & String(Len(Str(CInt(Col * Row))) - Len(CStr(Img(I_ROW, I_COL))), Chr(32))
        Next
        tempStr = tempStr & Chr(13) & Chr(10)
    Next
    MsgBox tempStr

3 楼


   我想问 MOZ你的作业本在那里?我找不到。

4 楼

上面的程序有错误!
我改了!
这是一个比较成熟的算法! 
可以随意选择四个边角中的一个为入口!
可以改变方向进入图形!只要改下循环的位置就可以了!
算是成功了!呵呵!  -纯粹就是模拟搜寻!
用这样的模拟法可以创选很多PL的图形效果!
就算是旋转图形也是很方便的!

    Dim Img(2, 3)   As Integer  ' Images array
    Dim Row         As Integer  ' rows
    Dim Col         As Integer  ' cols
    Dim Jsq         As Integer  ' temp
    Dim CS          As Integer  ' temp
    Dim X1          As Integer  ' left layer
    Dim X2          As Integer  ' right layer
    Dim Y1          As Integer  ' top layer
    Dim Y2          As Integer  ' bottom layer
    Dim tempStr     As String   ' temp
    Dim Index       As Integer  ' temp
    Dim SS          As Integer
    
    Row = 2
    Col = 3
    
    X1 = 1
    Y1 = 1
    X2 = Col
    Y2 = Row
    If Row < Col Then
        SS = Int(Row / 2) + (Row Mod 2)
    Else
        SS = Int(Col / 2) + (Col Mod 2)
    End If
    
    Do While CS <= SS
        CS = CS + 1
        ' ==================
        ' left
        ' ==================
        If X1 <= X2 Then
            For Index = Y1 To Y2
                Jsq = Jsq + 1
                Img(Index, X1) = Jsq
            Next
            X1 = X1 + 1
        End If
        ' ==================
        ' bottom
        ' ==================
        If Y1 <= Y2 Then
            For Index = X1 To X2
                Jsq = Jsq + 1
                Img(Y2, Index) = Jsq
            Next
            Y2 = Y2 - 1
        End If
        ' ==================
        ' right
        ' ==================
        If X2 >= X1 Then
            For Index = Y2 To Y1 Step -1
                Jsq = Jsq + 1
                Img(Index, X2) = Jsq
            Next
            X2 = X2 - 1
        End If
        ' ==================
        ' top
        ' ==================
        If Y2 >= Y1 Then
            For Index = X2 To X1 Step -1
                Jsq = Jsq + 1
                Img(Y1, Index) = Jsq
            Next
            Y1 = Y1 + 1
        End If
    Loop
    
    Dim I_COL As Integer
    Dim I_ROW As Integer
    tempStr = ""
    For I_ROW = 1 To Row Step 1
        For I_COL = 1 To Col Step 1
            tempStr = tempStr & CStr(Img(I_ROW, I_COL)) & String(Len(Str(CInt(Col * Row))) - Len(CStr(Img(I_ROW, I_COL))), Chr(32))
        Next
        tempStr = tempStr & Chr(13) & Chr(10)
    Next
    MsgBox tempStr

5 楼

把鼠标慢慢移动到“我的作业本第八题”那里,
当箭头到达这些字的上面的时候,字的颜色会发生改变,
说时迟,那时快。你的食指灵犀一点,点中了鼠标的左键,
于是浏览器就帮你把页面打开了。

6 楼

MOZ 真是高手呀! 呵呵! 连点鼠标的动作都精彩!呵呵!

7 楼

INPUT N
DIM A(N, N)
FOR I = 1 TO 4: READ X1(I), Y1(I), X2(I), Y2(I): NEXT I
DATA 1,0,1,-1,0,1,1,1,-1,0,-1,1,0,-1,0,0
Y = 1
FOR I = N - 1 TO 0 STEP -2
  IF I = 0 THEN A(X + 1, Y) = N * N: GOTO 10
  FOR J = 1 TO 4
    FOR K = 1 TO I
      X = X + X1(J): Y = Y + Y1(J)
      S = S + 1
      A(X, Y) = S
    NEXT K
    X = X + X2(J): Y = Y + Y2(J)
  NEXT J
NEXT I
10 FOR I = 1 TO N
  FOR J = 1 TO N
    PRINT USING "####"; A(I, J);
  NEXT J: PRINT
NEXT I
END
            

8 楼

CLS
INPUT N
DIM A(N, N)
FOR I = 1 TO 4: READ X1(I), Y1(I), X2(I), Y2(I): NEXT I
DATA 1,0,1,-1,0,1,1,1,-1,0,-1,1,0,-1,0,0
Y = 1
FOR I = N - 1 TO 0 STEP -2
  IF I = 0 THEN A(X + 1, Y) = N * N: GOTO 10
  FOR J = 1 TO 4
    FOR K = 1 TO I
      X = X + X1(J): Y = Y + Y1(J)
      S = S + 1
      A(X, Y) = S
    NEXT K
    X = X + X2(J): Y = Y + Y2(J)
  NEXT J
NEXT I
10 FOR I = 1 TO N
  FOR J = 1 TO N
    PRINT USING "####"; A(I, J);
  NEXT J: PRINT
NEXT I
END
            

我来回复

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