2011年11月8日 星期二

99正式 Problem 2-2


子題 2.
在一張地圖上標示有 8個城市,分別稱為「城市 1」到「城市 8」。假設地圖上存在若干單行道,這些單行道直接連接 1個起點城市及 1個終點城市。我們以「二維陣列」表示地圖上的城市及單行道的關係:我們設定一個二維陣列,假設陣列名稱為 a,而 a(i, j)表示陣列中的元素,其中 ij的值介於 18之間。當 a(i, j)=1時,表示存在一條直接從「城市 i」到「城市 j」的單行道;若 a(i, j)=0,表示不存在此單行道。問題:在一個給定的陣列資料中,判斷是否存在「正好經過 3條單行道」的道路,該道路從特定的「起點城市」開始,並且在特定的「終點城市」結束。

【註 1】同一條單行道可以在求解的「3條單行道」中重覆使用。
【註 2】若選手找出的道路只使用 1條或 2條單行道,都「不能算」存在此道路。在本題中,
必須是「正好使用 3條單行道」才能算是存在此道路。 
【註 3】為了說明方便,題目中假設陣列名稱為 a,但選手撰寫程式時不限定陣列之命名。
輸入說明:第 1~8行表示城市陣列的元素,每一行分為 8個元素,以「逗號」區隔。第 i行的第 j個元素,表示 a(i, j)的值。例如:第 1行的第 1個元素,表示 a(1, 1)的值;第 1行的第 2個元素,表示 a(1, 2) 的值;第 2行的第 1個元素,表示 a(2, 1) 的值,其餘類推。第 9101112行,每行分別有 2個元素,也是以「逗號」區隔,表示選手需要檢查的 1組「起點城市」及「終點城市」編號(其值均介於 18之間)。每個檔案檢查 4組資料。
輸出說明:共輸出 4行結果,依序表示輸入檔的 4組起訖城市,是否存在「正好經過 3條單行道」的道路?有則輸出「有路徑」,沒有則輸出「沒路徑」。



輸入檔案 1:【檔名:in1.txt】
0, 1, 1, 0, 1, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 1, 1, 0
0, 1, 0, 0, 0, 1, 0, 1
0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 1, 0, 0, 0
0, 1, 0, 1, 0, 0, 0, 0
0, 0, 1, 1, 0, 0, 0, 0
1, 5
2, 3
3, 8
4, 1



輸入檔案 2:【檔名:in2.txt】
0, 0, 1, 0, 1, 0, 1, 0
0, 0, 0, 0, 1, 1, 0, 0
0, 0, 0, 0, 0, 1, 0, 1
0, 0, 0, 0, 0, 0, 1, 0
0, 0, 0, 1, 0, 1, 0, 0
0, 0, 0, 0, 0, 0, 1, 0
0, 0, 0, 0, 0, 0, 0, 1
1, 1, 0, 0, 0, 0 ,0, 0
1, 7
2, 5
3, 6
4, 7

輸出檔案:【檔名:out.txt】

有路徑
沒路徑
有路徑
沒路徑


有路徑
沒路徑
有路徑
沒路徑


2 則留言:

  1. in.txt
    1, 2, 3

    原來可以直接Input #1,X,Y,Z
    不用在split!!


    Dim a(8, 8) As Byte
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in1.txt" For Input As #1
    Open App.Path & "\in2.txt" For Input As #2
    Open App.Path & "\out.txt" For Output As #3

    '------------------------in1.txt--------------
    For i = 1 To 8
    For j = 1 To 8
    Input #1, a(i, j)
    Next j
    Next i


    Do While Not EOF(1)
    ok = False

    Input #1, x, Y
    For i = 1 To 8
    If a(i, Y) = 1 Then
    For j = 1 To 8
    If a(j, i) = 1 Then
    If a(x, j) = 1 Then ok = True
    End If
    Next j
    End If
    Next i

    If ok = True Then Print #3, "有路徑" Else Print #3, "沒路徑"
    Loop

    '------------------------in2.txt--------------
    Print #3,
    For i = 1 To 8
    For j = 1 To 8
    Input #2, a(i, j)
    Next j
    Next i

    Do While Not EOF(2)
    ok = False

    Input #2, x, Y
    For i = 1 To 8
    If a(i, Y) = 1 Then
    For j = 1 To 8
    If a(j, i) = 1 Then
    If a(x, j) = 1 Then ok = True
    End If
    Next j
    End If
    Next i

    If ok = True Then Print #3, "有路徑" Else Print #3, "沒路徑"
    Loop


    Close #3
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  2. Dim P(8, 8)
    Private Sub Form_Load()

    Open App.Path & "\in1.txt" For Input As #1
    Open App.Path & "\in2.txt" For Input As #2
    Open App.Path & "\out.txt" For Output As #3
    Me.Hide

    For i = 1 To 8
    For j = 1 To 8
    Input #1, P(i, j)
    Next
    Next
    For i = 1 To 4
    Input #1, m, n
    List1.Clear
    Call A1(m, n, n)
    Call A2
    Next

    Print #3, " "

    For i = 1 To 8
    For j = 1 To 8
    Input #2, P(i, j)
    Next
    Next
    For i = 1 To 4
    Input #2, m, n
    List1.Clear
    Call A1(m, n, n)
    Call A2
    Next

    Close
    Close
    Close
    End
    End Sub

    Sub A1(a, b, c)
    If Len(c) = 4 Then
    If Right(Trim(c), 1) = Trim(a) Then List1.AddItem c
    Else
    For i = 1 To 8
    If InStr(c, i) = 0 Then Call A1(a, b, c & i)
    Next
    End If
    End Sub

    Sub A2()
    For i = 0 To List1.ListCount - 1
    ch = 0
    For j = 1 To 3
    m1 = Mid(List1.List(i), j, 1)
    m2 = Mid(List1.List(i), j + 1, 1)
    If P(m2, m1) = 1 Then ch = ch + 1
    Next
    If ch = 3 Then Print #3, "有路徑": Exit Sub
    Next
    Print #3, "沒路徑"
    End Sub

    回覆刪除