2016年8月3日 星期三

OX連線(VB版)

程式碼:


    Dim n As Integer '  n x n
    Dim a(10, 10) As Integer
    Private Sub Form1_Load( . . . ) Handles MyBase.Load
        FileOpen(1, "in1.txt", OpenMode.Input)
        FileOpen(2, "in2.txt", OpenMode.Input)
        FileOpen(3, "out.txt", OpenMode.Output)
        For fn = 1 To 2
            If fn = 2 Then PrintLine(3) ' in1, in2之間空一列
            n = LineInput(fn)
            ReDim a(n, n)
            For i = 0 To n - 1
                Dim dat() = LineInput(fn).Split(" ") '讀一列,依空格分成 dat陣列
                For k = 0 To UBound(dat)
                    Dim j As Integer = dat(k) - 1
                    If (j = -1) Then Exit For '若讀入 0 則j=-1 , 此列不處理
                    a(i, j) = 1
                Next
            Next
            '  print 測試用
            For i = 0 To n - 1
                For j = 0 To n - 1
                    Print(3, a(i, j))
                Next
                PrintLine(3)
            Next
            ' 六種方式呼叫 chk
            Dim ans = 0
            oi = 0
            For i = 0 To n - 1
                ans += chk(i, 0, 0, 1) '橫的
                ans += chk(0, i, 1, 0) '直的
                ans += chk(i, 0, -1, 1)  ' 最左欄 斜線由左下 向 右上
                ans += chk(i, 0, 1, 1) ' 最左欄 斜線由左上 向 右下
            Next
            For i = 0 To n - 1
                ans += chk(n - 1, i, -1, 1)  ' 最下列 斜線由左下 向 右上
                ans += chk(0, i, 1, 1)       ' 最上列 斜線由左上 向 右下
            Next
            Array.Sort(out, 0, oi) '第0個起 共oi個排序
            PrintLine(3, oi) ' 印出個數
            For i = 0 To oi - 1  ' 印出所有 的連線座標
                Dim x = 1 + Val(Mid(out(i), 1, 1)), y = 1 + Val(Mid(out(i), 2, 1))
                Dim xn = 1 + Val(Mid(out(i), 3, 1)), yn = 1 + Val(Mid(out(i), 4, 1))
                PrintLine(3, "(" & x & "," & y & ")" & "(" & xn & "," & yn & ")")
            Next
        Next fn
        End
    End Sub

    Dim out(100) As String  '存 起點、終點的字串
    Dim oi As Integer 'out 的個數

    Function chk(ByVal y, ByVal x, ByVal ym, ByVal xm) As Integer
        Dim yn = y, xn = x
        Dim cnt = 0
        Dim ox = a(y, x)  ' 第1格的值, 連線需皆相同
        For i = 1 To n - 1
            yn += ym : xn += xm  '下一格
            If (yn < 0 Or yn >= n Or xn < 0 Or xn >= n) Then Exit For '超出邊界
            If (a(yn, xn) <> ox) Then Return 0 '與第1格不同,連線不成立
            cnt += 1 '格數加1
        Next
        If (cnt < 2) Then Return 0 '第1格為0 需再加2格才會大於等於3格, 否則連線不成立
        ' 連線成立,記錄 起點、終點座標
        xn = x + xm * cnt : yn = y + ym * cnt '算出終點
        ' 以下記錄 起點、終點的方式 是因為題目規定最大為 10,
        ' 0~9可用一位數記錄,若>10就需另外的方式
        ' 將起點、終點 座標的4位數以字串 形式存入out 內
        out(oi) = x & y & xn & yn : oi += 1
        Return 1
    End Function

輸入 in1.txt
4
1 4
3 4
4
1 2 3 4
輸入in2.txt
5
1 2 3 4 5
3 4
4 5
1 2 5
0
輸出out.txt
 1  0  0  1
 0  0  1  1
 0  0  0  1
 1  1  1  1
 3
(1,3)(3,1)
(1,4)(4,4)
(4,1)(4,4)

 1  1  1  1  1
 0  0  1  1  0
 0  0  0  1  1
 1  1  0  0  1
 0  0  0  0  0
 5
(1,1)(5,1)
(1,2)(4,5)
(1,5)(5,5)
(2,1)(5,4)
(3,1)(5,3)

0 意見:

張貼留言