2012年7月22日 星期日

資料表示方式的應用(99模擬) -2

子題2(12%):在圖形結構中,有一種特別的圖形,稱之為「樹狀圖」(Tree)。在一個樹狀圖中,包含若干個「節」,每個節點和它的「上一層節點」及「下一層節點」相連。每個節點有「1 個」或是「沒有」上一層節點;也可能有「1個 」、多個」或是「沒有」下一層節點。這些節點中,只有1 個節點沒有上一層節點,所以它是最頂層的節點,我們稱之為「樹根」;其他「非樹根」的節點,都有1 個上一層節點,我們稱這些「上一層節點」是該節點的「父親」。現在給定一個樹狀圖資料,並給一個「目的地」節點名稱,請選手輸出從「樹根」連接到目的地經過的所有節點。輸出資料的順序,應從「樹根」開始,一層一層向下,最後到達「目的地」節點依序輸出,輸出的節點不能重覆。

輸入說明:第1 行表示共有多少個節點;第2 行是目的地節點;第3 行起是所有節點資料,每行有一組符號以逗號隔開,第1 個符號為「節點名稱」,第2 個符號為其「父親名稱」。若是「樹根」節點,其父親表示為「---」3 個連續減號。

輸出說明:列出從「樹根」連接到目的地經過的所有節點(包括樹根與目的地節點),而輸出的節點間至少以1 個空白相隔開。
輸入範例:【檔名:in-2-2.txt】
11
K
A,---
B,A
C,A
D,B
E,B
F,C
G,E
H,G
I,G
J,I
K,I
輸出範例:【檔名:out-2-2.txt】
A B E G I K

2 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Dim c()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    Input #1, x
    ReDim c(n, n)

    For i = 1 To n
    Line Input #1, y
    a = Split(y, ",")
    c(i, 0) = a(0)
    c(i, 1) = a(1)
    If a(0) = x Then b = i
    Next
    ans = ans & " " & x
    Do
    For j = 1 To n
    If c(b, 1) = c(j, 0) Then b = j: ans = " " & c(b, 0) & ans
    If c(b, 0) = "---" Then Exit For
    Next
    Loop Until c(b, 1) = "---"
    Print #2, ans
    Close
    Close
    End
    End Sub

    回覆刪除
  2. Dim g() As String
    Dim ans As String
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    Input #1, x
    ReDim g(2 * Val(n))
    r = Val(n) + 1
    For i = 1 To Val(n)
    Line Input #1, a
    b = Split(a, ",")
    g(i) = b(0)
    g(r) = b(1)
    r = r + 1
    Next i
    r = Val(n) + 1
    For i = 1 To Val(n)
    If g(i) = x Then Call c(g(i), g(r), Val(n))
    r = r + 1
    Next i
    Close #2
    Close #1
    End
    End Sub

    Sub c(d, e, h)
    r = h + 1
    ans = d & " " & ans
    If e = "---" Then Print #2, ans: Exit Sub
    For i = 1 To h
    If g(i) = e Then Call c(g(i), g(r), h)
    r = r + 1
    Next i
    End Sub

    回覆刪除