2012年10月2日 星期二

100正式Problem 2-2:二維陣列的應用


假設地圖上的每個小單位都有一個(x, y)座標,其中x 代表該單位的橫列值,y 代表縱列值。地圖上「最左上角」的小單位其座標值是(1, 1),該橫列第15 個小單位其座標值是(1,
15);第15 個橫列的第1 個小單位是(15, 1),該橫列最後1 個小單位是(15, 15)。如果我們任意給定地圖上「起點」及「終點」的座標,在地圖上此兩點均為「空白」,請問從起點到終點,在最多只能通過若干個空白單位的限制條件下,是否有可通行的路徑?(任一單位只能透過上、下、左、右四個方向連到下一單位。)
輸入說明:
第 1 行是最多能通過的空白單位數目(不包括起點及終點)。
第 2~16 行是地圖的資料,依序代表地圖上的每個橫列。每行有15 個符號,依序代表地圖上
每個橫列的15 個小單位。若符號為「0」,表示該單位為「空白」;若為「1」,表示已「填色」。
第 17 行為空行。
第 18、19 行是檢測第1 組資料。
第 18 行是「起點座標」,第1 個數字是起點的x 座標,空格後接著「y 座標」。
第 19 行是「終點座標」,第1 個數字是終點的x 座標,空格後接著「y 座標」。
第 20 行為空行。
第 21、22 行是檢測第2 組資料。
第 21 行是「起點座標」,第1 個數字是起點的x 座標,空格後接著「y 座標」。
第 22 行是「終點座標」,第1 個數字是終點的x 座標,空格後接著「y 座標」。
輸出說明:
第 1、2 行是輸入檔案1 的檢查結果。
第 1 行輸出第1 組檢測資料,在通過空白單位數目限制下,是否有可通行的路徑,若有則輸
出「TRUE」,沒有則輸出「FALSE」。
第 2 行輸出第2 組檢測資料的檢查結果,其值是「TRUE」或「FALSE」。
第 3 行是空白。
第 4、5 行是輸入檔案2 的檢查結果。
第 4 行輸出第1 組檢測資料的檢查結果,其值是「TRUE」或「FALSE」。
第 5 行輸出第2 組檢測資料的檢查結果,其值是「TRUE」或「FALSE」。
(輸出均為大寫,選手請注意。)
輸入檔案 1:【檔名:in1.txt】
15
011111110010000
000000000010000
000001000010000
000001000011110
000001000010010
111110100010100
000001011000100
000001001000100
100001001011111
100000001000000
100111111111111
100000100110000
100000100001000
100000000001000
100000000001000
3 3
5 13
14 11
8 5
輸入檔案 2:【檔名:in2.txt】
15
010000000000000
010000000111100
010000000100100
000000000100100
111111111100100
000001000000100
000001001000100
000001001000100
000001001000100
000001001000000
000001001111111
000001000100000
000001000100000
000001000100000
000000000100000
3 3
6 3
10 7
10 10
輸出檔案:【檔名:out.txt】
FALSE
TRUE

FALSE
TRUE

2 則留言:

  1. Dim K(16, 16) As Integer
    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

    For L = 1 To 2
    Input #L, m
    m = m + 6

    For i = 1 To 15
    Line Input #L, x
    For j = 1 To 15
    K(i, j) = Mid(x, j, 1)
    Next
    Next

    For H = 1 To 2
    Input #L, O
    Input #L, x1, y1
    Input #L, x2, y2
    Call abc(x1, y1, x2, y2, m)

    Next
    Print #3,
    Next
    Close
    Close
    Close
    End
    End Sub
    Sub abc(x1, y1, x2, y2, m)
    K(x1, y1) = 5
    n = 4
    Do Until K(x2, y2) <> 0 Or n = 230
    n = n + 1
    For i = 1 To 15
    For j = 1 To 15
    If K(i, j) = n Then
    If K(i + 1, j) = 0 Then K(i + 1, j) = n + 1
    If K(i - 1, j) = 0 Then K(i - 1, j) = n + 1
    If K(i, j + 1) = 0 Then K(i, j + 1) = n + 1
    If K(i, j - 1) = 0 Then K(i, j - 1) = n + 1
    End If
    Next
    Next
    Loop

    If K(x2, y2) <> 0 And K(x2, y2) <= m Then Print #3, "TRUE"
    If K(x2, y2) = 0 Or K(x2, y2) > m Then Print #3, "FALSE"
    For i = 1 To 15
    For j = 1 To 15
    If K(i, j) >= 5 Then K(i, j) = 0
    Next
    Next
    End Sub

    回覆刪除
  2. Dim K(16, 16) As Integer
    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

    For L = 1 To 2
    Input #L, m
    m = m + 6

    For i = 1 To 15
    Line Input #L, x
    For j = 1 To 15
    K(i, j) = Mid(x, j, 1)
    Next
    Next

    For H = 1 To 2
    Input #L, O
    Input #L, x1, y1
    Input #L, x2, y2
    List1.Clear
    Call abc(x1, y1, x2, y2, m)

    Next
    Print #3,
    Next
    Close
    Close
    Close
    End
    End Sub
    Sub abc(x1, y1, x2, y2, m)
    n = 4
    K(x1, y1) = 5
    Do Until K(x2, y2) <> 0 Or n = 230
    n = n + 1
    List1.AddItem x1 & " " & y1
    For L = 0 To (List1.ListCount - 1)
    a = Split(List1.List(L))
    i = a(0): j = a(1)
    If i <= 15 And i >= 1 And j <= 15 And j >= 1 And K(i, j) <> 1 Then
    If K(i, j - 1) = 0 Then K(i, j - 1) = n + 1: List2.AddItem i & " " & j - 1
    If K(i + 1, j) = 0 Then K(i + 1, j) = n + 1: List2.AddItem i + 1 & " " & j
    If K(i, j + 1) = 0 Then K(i, j + 1) = n + 1: List2.AddItem i & " " & j + 1
    If K(i - 1, j) = 0 Then K(i - 1, j) = n + 1: List2.AddItem i - 1 & " " & j
    End If
    Next
    List1.Clear
    For L = 0 To (List2.ListCount - 1)
    List1.AddItem List2.List(L)
    Next
    List2.Clear
    Loop
    If K(x2, y2) = 0 Or m < K(x2, y2) Then Print #3, "FALSE"
    If K(x2, y2) <> 0 And m >= K(x2, y2) Then Print #3, "TRUE"
    For i = 1 To 15
    For j = 1 To 15
    If K(i, j) >= 2 Then K(i, j) = 0
    Next
    Next
    End Sub

    回覆刪除