Дан указатель Р1 на корень непустого генеалогического дерева - VB

Узнай цену своей работы

Формулировка задачи:

Дан указатель Р1 на корень не пустого генеалогического дерева. Для двух дальних родствеников найти ближайшего общего предка.

Решение задачи: «Дан указатель Р1 на корень непустого генеалогического дерева»

textual
Листинг программы
Option Explicit
 
Private Type Node
    Name        As Long
    Parent      As Long
    ChildCount  As Long
    Child()     As Long
End Type
 
Dim Names()     As Variant
Dim Tree()      As Node
Dim maxw        As Long
Dim maxh        As Long
 
Private Sub Form_Load()
    Dim i1 As Long, i2 As Long, r As Long
    
    Randomize
    
    AutoRedraw = True: FillStyle = vbSolid: FillColor = vbWhite: ScaleMode = vbPixels
    Names = Array("ÀëåêñГ*Г*äð", "ГЂГ*Г*òîëèé", "Âèêòîð", "Àëåêñåé", "Äìèòðèé", "Г‚Г*ñèëèé", "ГЏГҐГІГ°", "ÈâГ*Г*", _
                  "ÍèêîëГ*Г©", "Ôåäîð", "ГЊГЁГµГ*ГЁГ«", "Ãðèãîðèé", "ËåîГ*ГЁГ¤", "ГЌГЁГЄГЁГІГ*", "Èëüÿ", "ÑòåïГ*Г*", _
                  "ÑòГ*Г*ГЁГ±Г«Г*Гў", "ÐîìГ*Г*", "Ñåðãåé", "ГЂГ*ГІГ®Г*")
    Create -1, 4
    Draw 0, 5, 5
    Me.Width = (Width - ScaleWidth * Screen.TwipsPerPixelX) + (maxw + 10) * Screen.TwipsPerPixelX
    Me.Height = (Height - ScaleHeight * Screen.TwipsPerPixelY) + (maxh + 10) * Screen.TwipsPerPixelY
    Show
    
    Do: i1 = Val(InputBox("Ââåäèòå Г*îìåð Г¤Г*ëüГ*ГҐГЈГ® ðîäñòâåГ*Г*ГЁГЄГ* В№1", "0")): Loop While i1 > UBound(Tree)
    Do: i2 = Val(InputBox("Ââåäèòå Г*îìåð Г¤Г*ëüГ*ГҐГЈГ® ðîäñòâåГ*Г*ГЁГЄГ* В№2", "0")): Loop While i2 > UBound(Tree)
    
    Caption = Format(i1, "00") & " " & Names(Tree(i1).Name) & " - " & Format(i2, "00") & " " & Names(Tree(i2).Name)
    r = Search(i1, i2)
    
    If r = -1 Then MsgBox "ГЌГҐГІ îáùåãî": Exit Sub
    
    MsgBox "ГЋГЎГ№ГЁГ© ïðåäîê: " & Format(r, "00") & " " & Names(Tree(r).Name)
End Sub
' Ïîèñê
Private Function Search(ByVal i1 As Long, ByVal i2 As Long) As Long
    Dim ti1 As Long, ti2 As Long
    ti1 = i1
    Do Until Tree(ti1).Parent = Tree(i2).Parent
        ti1 = Tree(ti1).Parent
        If ti1 = -1 Then ti1 = i1: i2 = i2 - 1: If i2 = -1 Then Exit Do
        DoEvents
    Loop
    Search = Tree(i2).Parent
End Function
' ÎòðèñîâêГ*
Private Sub Draw(ByVal i As Long, ByVal x As Long, y As Long)
    Dim n As Long, h As Long, w As Long, idx As Long, cap As String, ly As Long
    cap = Format(i, "00") & " " & Names(Tree(i).Name)
    ly = y: h = TextHeight(cap): w = TextWidth(cap)
    Line (x - 1, y)-Step(w + 2, h), &HF08020, B
    CurrentX = x: CurrentY = y: Print cap
    For n = 0 To Tree(i).ChildCount - 1
        Line (x + w + 2, ly + h \ 2)-(x + 100, y + h \ 2), &H808080
        idx = Tree(i).Child(n): Draw idx, x + 100, y
        If n < Tree(i).ChildCount - 1 Then y = y + h + 3
    Next
    If x + w > maxw Then maxw = x + w
    If y + h > maxh Then maxh = y + h
End Sub
' ÑîçäГ*Г*ГЁГҐ äåðåâГ*
Private Sub Create(ByVal Parent As Long, ByVal Level As Long)
    Dim i As Long, n As Long, c As Long
    c = Int(Rnd * 3)
    If Parent = -1 Then
        ReDim Tree(0): Parent = 0: Tree(i).Name = Int(Rnd * (UBound(Names) + 1))
        Tree(i).Parent = -1
    End If
    ReDim Tree(Parent).Child(c): Tree(Parent).ChildCount = c + 1
    For n = 0 To c
        i = UBound(Tree) + 1: ReDim Preserve Tree(i)
        Tree(Parent).Child(n) = i
        Tree(i).Name = Int(Rnd * (UBound(Names) + 1)): Tree(i).Parent = Parent
        If Level Then Create i, Level - 1
    Next
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы