2011年11月7日 星期一

99模擬 Problem 2:資料表示方式的應用

Problem 2:資料表示方式的應用
子題1(12%):在一張地圖上標示有若干個城市,及一些可雙向通行的道路。這些道路的頭、
尾,各連接一個不同的城市。我們用1 個一維整數陣列(假設稱為a 陣列),存放各個城市連
接的道路數目(存放順序不限)。為了判斷陣列中存放的道路數目值,是否可以正確的表達某
一張地圖上城市及道路的關係,我們利用以下步驟檢查(假設陣列的指標由1 開始):
步驟1:我們將陣列由大到小排序,令排序後的陣列為b 陣列。
步驟2:假設b(1) = k,我們將b(2)到b(k +1)共k 個元素,每個元素值都減1。
步驟3:我們將b(1)從b 陣列中移除,得一個「新陣列」。
第 3 頁,共 8 頁
步驟4:如果「新陣列」中,存在任何一個小於0 的元素值,原始a 陣列就是「不正確」陣列;
如果「新陣列」中的所有元素均等於0,原始a 陣列就是「正確」陣列。若在此步驟
達成判斷,檢查即可結束。
步驟5:在不能判斷正確與否時,將「新陣列」代入步驟1,重覆上述檢查,直到達成判斷條
件為止。

輸入說明:
第1~4 行表示將判斷之4 組陣列值,各元素間以逗號區隔,每組陣列最多有10 個元素。輸入
檔之元素值,不會造成選手進行「步驟2」時產生「陣列索引值超出範圍」的錯誤。
輸出說明:
第1~4 行分別輸出第1~4 組陣列的正確與否。當正確輸出「正確」,不正確時輸出「不正確」。
輸入範例:【檔名:in-2-1.txt】
1, 1, 2, 5, 3, 2
4, 3, 1, 1, 1
4, 4, 4, 3, 3
3, 3, 3, 3, 3
輸出範例:【檔名:out-2-1.txt】
正確
不正確
正確
不正確

2 則留言:

  1. Dim s, ss
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Line Input #1, n
    n = Replace(n, ",", " ")
    s = Split(n)
    Call A1
    Loop
    Close
    Close
    End Sub

    Sub A1()
    ZZ:
    '步驟1:我們將陣列由大到小排序,令排序後的陣列為b 陣列。
    Call A2
    '步驟2:假設b(1) = k,我們將b(2)到b(k +1)共k 個元素,每個元素值都減1。
    k = s(0)
    MsgBox k
    For i = 1 To k
    s(i) = s(i) - 1
    Next
    '步驟3:我們將b(1)從b 陣列中移除,得一個「新陣列」。
    ReDim ss(UBound(s) - 1)
    For i = 1 To UBound(s)
    ss(i - 1) = s(i)
    Next
    '步驟4:如果「新陣列」中,存在任何一個小於0 的元素值,原始a 陣列就是「不正確」陣列;
    '如果「新陣列」中的所有元素均等於0,原始a 陣列就是「正確」陣列。若在此步驟
    ReDim s(UBound(ss))
    Dim ch As Boolean
    For i = 0 To UBound(ss)
    s(i) = ss(i): If ss(i) <> 0 Then ch = True: If ss(i) < 0 Then Print #2, "不正確": Exit Sub:
    Next
    If ch = False Then
    Print #2, "正確"
    Else
    If s(0) = "" Then Print #2, "正確": Exit Sub
    GoTo ZZ:
    End If
    End Sub

    Sub A2()
    For i = 0 To UBound(s)
    For j = 0 To UBound(s) - 1
    If s(j) < s(j + 1) Then
    tmp = s(j)
    s(j) = s(j + 1)
    s(j + 1) = tmp
    End If
    Next
    Next
    End Sub



    花時間又分數少的題目 = =

    回覆刪除
  2. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    OK = True
    List1.Clear
    Line Input #1, X
    Y = Split(X, ", ")

    '步驟1:我們將陣列由大到小排序,令排序後的陣列為b 陣列。
    For i = 0 To UBound(Y) - 1
    For j = i + 1 To UBound(Y)
    If Val(Y(i)) < Val(Y(j)) Then Call Swap(Y(i), Y(j))
    Next j
    Next i

    For i = 0 To UBound(Y)
    List1.AddItem Y(i)
    Next i



    Do
    For i = 1 To (List1.List(0))
    '步驟2:假設b(1) = k,我們將b(2)到b(k +1)共k 個元素,每個元素值都減1。
    List1.List(i) = Val(List1.List(i)) - 1
    '步驟4:如果「新陣列」中,存在任何一個小於0 的元素值,原始a 陣列就是「不正確」陣列;
    If Val(List1.List(i)) < 0 Then OK = False: Exit Do
    Next i
    '步驟3:我們將b(1)從b 陣列中移除,得一個「新陣列」。
    List1.RemoveItem (0)
    '步驟5:在不能判斷正確與否時,將「新陣列」代入步驟1,重覆上述檢查,直到達成判斷條件為止。
    Loop Until check() = True

    If OK = True Then Print #2, "正確" Else Print #2, "不正確"

    Loop
    Close #2
    Close #1
    End
    End Sub

    Sub Swap(A, B)
    T = A
    A = B
    B = T
    End Sub

    Function check()
    P = True
    For i = 0 To Val(List1.ListCount - 1)
    If Val(List1.List(i)) <> 0 Then P = False: Exit For
    Next i
    check = P
    End Function

    回覆刪除