一个m*n 矩阵,从四个角的任一个点开始,不论顺时针还是逆时针,按螺旋方式把所有点走一遍。每个点只能走一次。谢谢,谁能给出源代码?高手们,加油啊!

解决方案 »

  1.   

    新建立一个工程:
    再建立一个picture1
    再建立一个Command1
    Private Sub Command1_Click()
      Dim A3(5, 6) As String
      For i = 1 To 5
        For j = 1 To 6
           A3(i, j) = i & "," & j
        Next
      Next
      Picture1.AutoRedraw = True
      LoadData A3, 1, 1, 5, 6
      
    End Sub
    Private Function LoadData(Data() As String, BeginRow As Long, BeginColumn As Long, RowCount As Long, ColumnCount As Long)
       If BeginRow > RowCount Then Exit Function
       If BeginColumn > ColumnCount Then Exit Function
       For i = BeginColumn To ColumnCount
         Picture1.Print Data(BeginColumn, i)
       Next
       For i = BeginRow + 1 To RowCount
         Picture1.Print Data(i, ColumnCount)
       Next
       For i = ColumnCount - 1 To BeginColumn Step -1
         If ColumnCount - 1 = BeginColumn Then Exit Function
         Picture1.Print Data(RowCount, i)
       Next
       For i = RowCount - 1 To BeginRow + 1 Step -1
         Picture1.Print Data(i, BeginRow)
       Next
       LoadData Data, BeginRow + 1, BeginColumn + 1, RowCount - 1, ColumnCount - 1
    End Function
      

  2.   


    Private Const MAXROW = 5
    Private Const MAXCOL = 6
    Private Sub Command1_Click()
        Dim A3(MAXROW, MAXCOL) As String
        For i = 0 To MAXROW
            For j = 0 To MAXCOL
                A3(i, j) = CStr(i) & "," & CStr(j)
            Next
        Next
        LoadData A3, 0, 6
      
    End Sub
    Private Function LoadData(Data() As String, lBeginRow As Long, lBeginCol As Long)
        
        '首先判断起点是否为四角
        If (lBeginRow <> 0 And lBeginRow <> MAXROW) Or _
            (lBeginCol <> 0 And lBeginCol <> MAXCOL) Then
            
            MsgBox "起点不是四角的任何一点", vbInformation, "提示"
            Exit Function
            
        End If
        
        Dim lRow As Long    '行循环计数
        Dim lCol As Long    '列循环计数
        Dim lColStart As Long
        Dim lColEnd As Long
        Dim lRowStart As Long
        Dim lRowEnd As Long
        Dim lRowStep As Long
        Dim lColStep As Long
        
        If lBeginRow = 0 Then
            lRowStart = 0
            lRowEnd = MAXROW
            lRowStep = 1
        Else
            lRowStart = MAXROW
            lRowEnd = 0
            lRowStep = -1
        End If
        
        If lBeginCol = 0 Then
            lColStart = 0
            lColEnd = MAXCOL
            lColStep = 1
        Else
            lColStart = MAXCOL
            lColEnd = 0
            lColStep = -1
        End If
        
        For lRow = lRowStart To lRowEnd Step lRowStep
            For lCol = lColStart To lColEnd Step lColStep
                Debug.Print Data(lRow, lCol)
            Next
            ExChangeStartEnd lColStart, lColEnd, lColStep
        Next
        
    End Function'交换开始结束的值,并重新设置Step(递增还是递减)
    Private Sub ExChangeStartEnd(ByRef lStart As Long, ByRef lEnd As Long, ByRef lStep As Long)
        Dim lTemp As Long
        lTemp = lStart
        lStart = lEnd
        lEnd = lTemp
        lStep = lStep * -1
    End Sub以上代码就可以实现楼主想要的功能了
    我主要是参考了楼上的内容
    就只是修改了LoadData函数
      

  3.   

    还有就是,我的代码没用PictureBox
    而是直接用的Debug.Print
    所以想要看结果就打开ImmediateWindow就可以了
    楼主也只要改那个地方就能实现自己想要的功能了
      

  4.   

    http://topic.csdn.net/u/20080710/09/5d6dea66-02b1-4f9f-9d7d-6b65638ed1ac.html上面贴子也是这个问题:
    LZ不知怎么?那这样不行吗?
    如果不行说明:
    以下是更完美的.Private Enum Way
      curLeft = 1   '左转
      curRight = 2  '右转
    End Enum
    Private Enum Incept
       LeftTop = 1    '起始点左上角
       RightTop = 2   '起始点右上角
       LeftBottom = 3  '起始点左下角
       RightBottom = 4  '起始点右下角
    End Enum
    Private Function LoadData(Data() As String, BeginRow As Long, BeginColumn As Long, RowCount As Long, ColumnCount As Long, curWay As Way, curIncept As Incept, inceptIndex As Long, returnArr() As String)
       If BeginRow > RowCount Then Exit Function
       If BeginColumn > ColumnCount Then Exit Function
       If curWay = curLeft Then
          Select Case curIncept
             Case LeftTop
                 For i = BeginRow To RowCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
                 
                 For i = BeginColumn + 1 To ColumnCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
                 
                 For i = RowCount - 1 To BeginRow Step -1
                    If RowCount - 1 = BeginRow Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
                 
                 For i = ColumnCount - 1 To BeginColumn + 1 Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginColumn, i)
                 Next
             Case RightTop
                 For i = ColumnCount To BeginColumn Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginColumn, i)
                 Next
                 For i = BeginRow + 1 To RowCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
                 
                 For i = BeginColumn + 1 To ColumnCount
                    If BeginColumn + 1 = ColumnCount Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
                 
                 For i = RowCount - 1 To BeginRow + 1 Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
             Case LeftBottom
                 For i = BeginColumn To ColumnCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
                 
                 For i = RowCount - 1 To BeginRow Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
                 
                 For i = ColumnCount - 1 To BeginColumn Step -1
                    If ColumnCount - 1 = BeginColumn Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginColumn, i)
                 Next
           
                 For i = BeginRow + 1 To RowCount - 1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
             Case RightBottom
                 For i = RowCount To BeginRow Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
                 
                 For i = ColumnCount - 1 To BeginColumn Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginColumn, i)
                 Next
           
                 For i = BeginRow + 1 To RowCount
                    If BeginRow + 1 = RowCount Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
                 
                 For i = BeginColumn + 1 To ColumnCount - 1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
         End Select
       Else
          Select Case curIncept
             Case LeftTop
                 For i = BeginColumn To ColumnCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginRow, i)
                 Next
             
                 For i = BeginRow + 1 To RowCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
                 
                 For i = ColumnCount - 1 To BeginColumn Step -1
                    If ColumnCount - 1 = BeginColumn Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
                 
                 For i = RowCount - 1 To BeginRow + 1 Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
                 
             Case RightTop
                 For i = BeginRow To RowCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
                 
                 For i = ColumnCount - 1 To BeginColumn Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
                 
                 For i = RowCount - 1 To BeginRow Step -1
                    If RowCount - 1 = BeginRow Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
           
                 For i = BeginColumn + 1 To ColumnCount - 1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginRow, i)
                 Next
             Case LeftBottom
                 For i = RowCount To BeginRow Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
           
                 For i = BeginColumn + 1 To ColumnCount
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginRow, i)
                 Next
           
                For i = BeginRow + 1 To RowCount
                    If BeginRow + 1 = RowCount Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
                 
                 For i = ColumnCount - 1 To BeginColumn + 1 Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
             Case RightBottom
                    For i = ColumnCount To BeginColumn Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(RowCount, i)
                 Next
                 
                 For i = RowCount - 1 To BeginRow Step -1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, BeginRow)
                 Next
           
                 For i = BeginColumn + 1 To ColumnCount
                    If BeginColumn + 1 = ColumnCount Then Exit Function
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(BeginRow, i)
                 Next
           
                For i = BeginRow + 1 To RowCount - 1
                    inceptIndex = inceptIndex + 1
                    returnArr(inceptIndex) = Data(i, ColumnCount)
                 Next
       
         End Select
       End If
       LoadData Data, BeginRow + 1, BeginColumn + 1, RowCount - 1, ColumnCount - 1, curWay, curIncept, inceptIndex, returnArr
    End Function
      

  5.   

    接上:调用方法:Private Sub Command1_Click()
      Dim A3(5, 6) As String
      For i = 1 To 5
        For j = 1 To 6
           A3(i, j) = i & "," & j
        Next
      Next
      
      Dim Arr(30) As String  '返回数组,一定要是矩阵的数据总数,
      
      Picture1.AutoRedraw = True
      LoadData A3, 1, 1, 5, 6, curRight, LeftBottom, 0, Arr
      
      For i = 1 To 30
        Picture1.Print Arr(i)   '按顺序列出
      Next
    End Sub