Function Sway(start, ends)Dim dis, st, ed, i, J, pos As Integer
Dim nStep As Integer
ReDim disNodeInfo(UBound(Map), 2) As Integer
Dim spos, dpos, dd As Integer
Dim nodeName, tmpStr, tmp, path As String
ReDim S(UBound(Map)) As Integerdis = 0
st = 0
ed = 0
i = 0
J = 0
pos = 0
nStep = 0
spos = 0
dpos = 0
dd = 0
noname = ""
tmpStr = ""
path = ""For i = 0 To UBound(Map)    S(i) = 0
    disNodeInfo(i, 0) = 511
    disNodeInfo(i, 1) = -1
    
    dpos = InStr(Map(i), ",")
    nodeName = Mid(Map(i), 1, dpos - 1)
    If 0 = StrComp(start, nodeName) Then st = i
    If 0 = StrComp(ends, nodeName) Then ed = i
Next ipos = ed
nStep = 0S(ed) = 1
disNodeInfo(ed, 0) = 0
disNodeInfo(ed, 1) = -1Do While (st <> pos And nStep < UBound(Map))If IsStop = True Then
Exit Function
End If
OutStr ("正在计算......")    For i = 0 To UBound(Map)        If IsStop = True Then
        Exit Function
        End If
        
        If (1 = S(i) And nStep = disNodeInfo(i, 0)) Then
            pos = i
            spos = 0
            tmpStr = Map(i) + ","
            dpos = InStr(tmpStr, ",")
            spos = dpos
            dpos = InStr(spos + 1, tmpStr, ",")
           Do While (dpos > 0)
                If IsStop = True Then
                Exit Function
                End If                tmp = Mid(tmpStr, spos + 1, dpos - spos - 1)
                For J = 0 To UBound(Map)
                    If IsStop = True Then
                    Exit Function
                    End If                    dd = InStr(Map(J), ",")
                    nodeName = Mid(Map(J), 1, dd - 1)
                    If 0 = StrComp(tmp, nodeName) Then
                        Exit For
                    End If
                Next J
                If (1 <> S(J)) Then
                    S(J) = 1
                    disNodeInfo(J, 0) = nStep + 1
                    disNodeInfo(J, 1) = pos
                Else
                    If disNodeInfo(J, 0) + 1 < nStep Then
                        disNodeInfo(pos, 0) = disNodeInfo(J, 0) + 1
                        disNodeInfo(pos, 1) = J
                    End If
                End If
                spos = dpos
                dpos = InStr(spos + 1, tmpStr, ",")
            Loop
        End If
    Next i
    nStep = nStep + 1
Loop
dpos = InStr(Map(st), ",")
nodeName = Mid(Map(st), 1, dpos - 1)
pos = st
path = ""
Do While (pos <> ed And pos >= 0)
If IsStop = True Then
Exit Function
End If
    dpos = InStr(Map(pos), ",")
    nodeName = Mid(Map(pos), 1, dpos - 1)
    path = path & nodeName + ","
    pos = disNodeInfo(pos, 1)Loop
dpos = InStr(Map(pos), ",")
nodeName = Mid(Map(pos), 1, dpos - 1)
path = path & nodeName + ","
Sway = path
End Function这是段帝结斯卡拉的计算。小数据还挺快。数据一多。要8。9秒。。求人帮着优化一下。

解决方案 »

  1.   

    Public MapI() As String
    Public Sub MapInit()
    MapinFor J = 0 To UBound(MapI)
    'MsgBox MapI(J)
        For i = 1 To UBound(Split(MapI(J), vbCrLf))
        
            ReDim Preserve Map(T)
            Map(T) = Split(MapI(J), vbCrLf)(i)
            T = T + 1    Next
    Next
    End Sub
    Public Sub Mapin()
    Dim stm As String
    Dim i As Integer
    Dim J As Integer
    Dim MapTemp() As String
    i = 0
    J = 0
    MapPath = App.path & "\Data.dll"
    Tfl = FreeFile
    Open MapPath For Input As #Tfl
    Do Until EOF(Tfl)
    Line Input #Tfl, stm
            If stm > "" Then
          '  If enStr = "" Then
          '  enStr = Crypt(stm, "100")
          '  Else
          '  enStr = enStr & Crypt("/!", "100") & Crypt(stm, "100")
          '  End If
                If stm = "[next]" Then
                  i = 0
                  'If J > 1 Then
                  'MsgBox MapI(J - 1)
                  'End If
                    ReDim Preserve MapI(J)
                    ReDim Preserve MapName(J)
                  MapName(J) = MapTemp(0)
                  MapI(J) = MapTemp(1)
                  
                  For K = 2 To UBound(MapTemp)
                  MapI(J) = MapI(J) & vbCrLf & MapTemp(K)
                  Next
                  J = J + 1
                Else
                  ReDim Preserve MapTemp(i)
                  MapTemp(i) = stm
                i = i + 1
                End If
            End If
    Loop
        Close #Tfl
    End SubSub outstr(ss)
    Form1.Caption = ss
    End SubFunction Sway(start, ends) Dim dis, st, ed, i, J, pos As Integer 
    Dim nStep As Integer 
    ReDim disNodeInfo(UBound(Map), 2) As Integer 
    Dim spos, dpos, dd As Integer 
    Dim nodeName, tmpStr, tmp, path As String 
    ReDim S(UBound(Map)) As Integer dis = 0 
    st = 0 
    ed = 0 
    i = 0 
    J = 0 
    pos = 0 
    nStep = 0 
    spos = 0 
    dpos = 0 
    dd = 0 
    noname = "" 
    tmpStr = "" 
    path = "" 
    For i = 0 To UBound(Map)     S(i) = 0 
        disNodeInfo(i, 0) = 511 
        disNodeInfo(i, 1) = -1 
        
        dpos = InStr(Map(i), ",") 
        nodeName = Mid(Map(i), 1, dpos - 1) 
        If 0 = StrComp(start, nodeName) Then st = i 
        If 0 = StrComp(ends, nodeName) Then ed = i 
    Next i pos = ed 
    nStep = 0 S(ed) = 1 
    disNodeInfo(ed, 0) = 0 
    disNodeInfo(ed, 1) = -1 Do While (st <> pos And nStep < UBound(Map)) If IsStop = True Then 
    Exit Function 
    End If 
    OutStr ("正在计算......")     For i = 0 To UBound(Map)         If IsStop = True Then 
            Exit Function 
            End If 
            
            If (1 = S(i) And nStep = disNodeInfo(i, 0)) Then 
                pos = i 
                spos = 0 
                tmpStr = Map(i) + "," 
                dpos = InStr(tmpStr, ",") 
                spos = dpos 
                dpos = InStr(spos + 1, tmpStr, ",") 
              Do While (dpos > 0) 
                    If IsStop = True Then 
                    Exit Function 
                    End If                 tmp = Mid(tmpStr, spos + 1, dpos - spos - 1) 
                    For J = 0 To UBound(Map) 
                        If IsStop = True Then 
                        Exit Function 
                        End If                     dd = InStr(Map(J), ",") 
                        nodeName = Mid(Map(J), 1, dd - 1) 
                        If 0 = StrComp(tmp, nodeName) Then 
                            Exit For 
                        End If 
                    Next J 
                    If (1 <> S(J)) Then 
                        S(J) = 1 
                        disNodeInfo(J, 0) = nStep + 1 
                        disNodeInfo(J, 1) = pos 
                    Else 
                        If disNodeInfo(J, 0) + 1 < nStep Then 
                            disNodeInfo(pos, 0) = disNodeInfo(J, 0) + 1 
                            disNodeInfo(pos, 1) = J 
                        End If 
                    End If 
                    spos = dpos 
                    dpos = InStr(spos + 1, tmpStr, ",") 
                Loop 
            End If 
        Next i 
        nStep = nStep + 1 
    Loop 
    dpos = InStr(Map(st), ",") 
    nodeName = Mid(Map(st), 1, dpos - 1) 
    pos = st 
    path = "" 
    Do While (pos <> ed And pos >= 0) 
    If IsStop = True Then 
    Exit Function 
    End If 
        dpos = InStr(Map(pos), ",") 
        nodeName = Mid(Map(pos), 1, dpos - 1) 
        path = path & nodeName + "," 
        pos = disNodeInfo(pos, 1) Loop 
    dpos = InStr(Map(pos), ",") 
    nodeName = Mid(Map(pos), 1, dpos - 1) 
    path = path & nodeName + "," 
    Sway = path 
    End Function 以上是代码。。
    下面的是数据
    muyecaoyuan
    牧野草原
    牧野草原.牧野草原01,牧野草原.牧野草原00,牧野草原.牧野草原02
    牧野草原.牧野草原02,牧野草原.牧野草原01,牧野草原.牧野草原12,牧野草原.牧野草原13
    牧野草原.牧野草原03,牧野草原.牧野草原14,猫隐.村口
    牧野草原.牧野草原04,牧野草原.牧野草原06,牧野草原.牧野草原08,牧野草原.牧野草原10
    牧野草原.牧野草原05,牧野草原.牧野草原00,牧野草原.牧野草原06
    牧野草原.牧野草原06,牧野草原.牧野草原04,牧野草原.牧野草原05,万马草原.万马草原_03
    牧野草原.牧野草原07,牧野草原.牧野草原00,牧野草原.牧野草原10
    牧野草原.牧野草原08,牧野草原.牧野草原04,牧野草原.牧野草原15,牧野草原.牧野草原16
    牧野草原.牧野草原09,牧野草原.牧野草原22,牧野草原.牧野草原23
    牧野草原.牧野草原10,牧野草原.牧野草原04,牧野草原.牧野草原07,牧野草原.牧野草原11
    牧野草原.牧野草原11,牧野草原.牧野草原10,牧野草原.牧野草原12
    牧野草原.牧野草原12,牧野草原.牧野草原11,牧野草原.牧野草原13,牧野草原.牧野草原02,牧野草原.牧野草原17
    牧野草原.牧野草原13,牧野草原.牧野草原02,牧野草原.牧野草原12,牧野草原.牧野草原14
    牧野草原.牧野草原14,牧野草原.牧野草原13,牧野草原.牧野草原18,牧野草原.牧野草原03
    牧野草原.牧野草原15,牧野草原.牧野草原08,牧野草原.牧野草原20
    牧野草原.牧野草原16,牧野草原.牧野草原08,牧野草原.牧野草原20
    牧野草原.牧野草原17,牧野草原.牧野草原12,牧野草原.牧野草原24
    牧野草原.牧野草原18,牧野草原.牧野草原14,牧野草原.牧野草原24,牧野草原.牧野草原25
    牧野草原.牧野草原20,牧野草原.牧野草原15,牧野草原.牧野草原16,牧野草原.牧野草原26
    牧野草原.牧野草原21,牧野草原.牧野草原22,牧野草原.牧野草原26
    牧野草原.牧野草原22,牧野草原.牧野草原21,牧野草原.牧野草原32,牧野草原.牧野草原09
    牧野草原.牧野草原23,牧野草原.牧野草原09,牧野草原.牧野草原22,牧野草原.牧野草原24,牧野草原.牧野草原33
    牧野草原.牧野草原24,牧野草原.牧野草原17,牧野草原.牧野草原18,牧野草原.牧野草原23
    牧野草原.牧野草原25,牧野草原.牧野草原18,牧野草原.牧野草原27,牧野草原.牧野草原28
    牧野草原.牧野草原26,牧野草原.牧野草原20,牧野草原.牧野草原21,牧野草原.牧野草原30
    牧野草原.牧野草原27,牧野草原.牧野草原25,牧野草原.牧野草原34
    牧野草原.牧野草原28,牧野草原.牧野草原34,牧野草原.牧野草原25,牧野草原.牧野草原35
    牧野草原.牧野草原30,牧野草原.牧野草原26,牧野草原.牧野草原31
    牧野草原.牧野草原31,牧野草原.牧野草原30,牧野草原.牧野草原32
    牧野草原.牧野草原32,牧野草原.牧野草原31,牧野草原.牧野草原33,牧野草原.牧野草原22
    牧野草原.牧野草原33,牧野草原.牧野草原32,牧野草原.牧野草原23,牧野草原.牧野草原36
    牧野草原.牧野草原34,牧野草原.牧野草原36,牧野草原.牧野草原27,牧野草原.牧野草原28
    牧野草原.牧野草原35,牧野草原.牧野草原28,低矮林地.矮林边界
    牧野草原.牧野草原36,牧野草原.牧野草原33,牧野草原.牧野草原34
    牧野草原.牧野草原00,牧野草原.牧野草原01,牧野草原.牧野草原05,牧野草原.牧野草原07
    [next]