2011年8月31日 星期三

資料表示方式的應用(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

3 則留言:

  1. 由後而前
    像是在找爸爸~

    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, E
    For i = 1 To N
    Line Input #1, X
    Y = Split(X, ",")
    List1.AddItem Y(0)
    List2.AddItem Y(1)
    If Y(0) = E Then Exit For
    Next i

    ans = E

    i = List1.ListCount - 1
    Do
    ans = List2.List(i) & " " & ans
    i = W(List2.List(i))
    Loop Until List2.List(i) = "---"



    Print #2, ans

    Close #2
    Close #1
    End
    End Sub

    Function W(A) '查詢位子
    For i = 0 To List1.ListCount - 1
    If A = List1.List(i) Then W = i: Exit For
    Next i
    End Function

    回覆刪除
  2. 佑好,
    這題你的程式有錯誤。
    問題出在你想「快」的這一行。
    If Y(0) = E Then Exit For
    題目中的每個節點,並沒有依一定的順序的,所以,你還是要完整的將所有的節點給讀進去的。

    回覆刪除
  3. 熊掌好,

    我懂了,
    他有可能是
    ----------in.txt
    11
    K
    K,I
    B,A
    C,A
    D,B
    E,B
    F,C
    G,E
    H,G
    I,G
    J,I
    A,---



    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, E
    For i = 1 To N
    Line Input #1, X
    Y = Split(X, ",")
    List1.AddItem Y(0)
    List2.AddItem Y(1)
    If Y(0) = E Then M = (i - 1)
    Next i

    ans = E

    Do
    ans = List2.List(M) & " " & ans
    M = W(List2.List(M))
    Loop Until List2.List(M) = "---"



    Print #2, ans

    Close #2
    Close #1
    End
    End Sub

    Function W(A) '查詢位子
    For i = 0 To List1.ListCount - 1
    If A = List1.List(i) Then W = i: Exit For
    Next i
    End Function

    回覆刪除