Vb.net Gems游戏步骤计算,换句话说就是一些数学

Vb.net Gems游戏步骤计算,换句话说就是一些数学,vb.net,algorithm,vb.net-2010,Vb.net,Algorithm,Vb.net 2010,我有一个程序可以扫描图像并将宝石转换成特定的数字。请看下图: 所以我有一张有数字的桌子。1号代表黄色宝石,2号代表蓝色宝石,等等 比如: 我想计算一步,得到3个相等的数字(宝石)水平或垂直。例如,在这个表中,如果我将E2与D2交换,D2将是1,D2、D3、D4将创建一个有效的步骤,因为它都是1我正在使用VB.NET 2010。 我的桌子是8x8大小,这只是上面的一个例子。 现在我只是把这些值放在多个变量中(A1=1,A2=3,等等) 希望您能理解我的问题,如有任何帮助,我们将不胜感激。如果您希

我有一个程序可以扫描图像并将宝石转换成特定的数字。请看下图:

所以我有一张有数字的桌子。1号代表黄色宝石,2号代表蓝色宝石,等等

比如:

我想计算一步,得到3个相等的数字(宝石)水平或垂直。例如,在这个表中,如果我将E2与D2交换,D2将是1,D2、D3、D4将创建一个有效的步骤,因为它都是1我正在使用VB.NET 2010。

我的桌子是8x8大小,这只是上面的一个例子。

现在我只是把这些值放在多个变量中(A1=1,A2=3,等等)

希望您能理解我的问题,如有任何帮助,我们将不胜感激。

如果您希望一行有三个(或更多)数字,请执行以下操作:

  • 在一行中扫描两个(或更多)相等的数字
  • 对于找到的每一行,检查两端的邻域是否包含将扩充该行的元素
  • 如果你发现了什么,你就有你的行动并且完成了
该街区的定义如下:

    0
   0x0   x is the central point, 0 are the neighbours.
    0
例如

给你:

Module Module1

    Sub Main()
        Dim input = {{1, 3, 2, 4, 1, 1, 2, 1},
                     {1, 2, 5, 3, 2, 1, 3, 4},
                     {2, 1, 5, 4, 3, 2, 5, 4},
                     {3, 5, 1, 5, 2, 4, 1, 2},
                     {4, 2, 5, 1, 5, 2, 4, 2},
                     {2, 3, 2, 2, 5, 1, 3, 1},
                     {2, 1, 5, 4, 3, 2, 5, 4},
                     {3, 5, 1, 3, 2, 4, 1, 2}}

        Console.WriteLine("INPUT:")
        Console.Write("   |")
        For i = 1 To input.GetLength(1)
            Console.Write("{0,3}", GetColumnName(i))
        Next
        Console.Write(vbCrLf)
        Console.Write("---+")
        For i = 1 To input.GetLength(1)
            Console.Write("---")
        Next
        Console.Write(vbCrLf)

        For y = 0 To input.GetUpperBound(0)
            Console.Write("{0,3}|", y + 1)
            For x = 0 To input.GetUpperBound(1)
                Console.Write("{0,3}", input(y, x))
            Next
            Console.Write(vbCrLf)
        Next

        Console.WriteLine("{0}{0}SOLUTION:", vbCrLf)
        For Each match In Solve(input)
            Console.WriteLine("Move {0} {1} for a match of {2}", match.Item1, match.Item2, match.Item3)
        Next
        Console.ReadLine()
    End Sub

    Function Solve(ByVal input As Integer(,)) As IEnumerable(Of Tuple(Of String, Char, Integer))
        Dim matches As New List(Of Tuple(Of String, Char, Integer))
        Dim result As Tuple(Of Boolean, Tuple(Of String, Char, Integer))
        Dim test As Integer(,)

        Dim maxX = input.GetUpperBound(0) - 1
        Dim maxY = input.GetUpperBound(1) - 1

        For x = 0 To maxX
            For y = 0 To maxY
                ReDim test(If(maxX - x > 4, 3, maxX - x), If(maxY - y > 4, 3, maxY - y))
                For x1 = x To x + test.GetLength(0) - 1
                    For y1 = y To y + test.GetLength(1) - 1
                        test(x1 - x, y1 - y) = input(y1, x1)
                    Next
                Next

                'check if the result is a match
                For Each result In {IsMatchOnThird(test), IsMatchOnSecond(test), IsMatchOnFirst(test)}  '<-- Updated Line
                    If result.Item1 = True Then
                        Dim matchPoint = Tuple.Create(CInt(result.Item2.Item1.Split(","c)(0)),
                                                      CInt(result.Item2.Item1.Split(","c)(1)))

                        matches.Add(Tuple.Create(GetColumnName(matchPoint.Item1 + x + 1) & CStr(matchPoint.Item2 + y + 1),
                                                 result.Item2.Item2, result.Item2.Item3))
                    End If
                Next
            Next
        Next

        Return RemoveDuplicates(matches)
    End Function

   Public Function GetColumnName(ByVal colIndex As Integer) As String
        Dim result As New List(Of String)

        Do While colIndex > 0
            result.Insert(0, Chr(65 + CInt((colIndex - 1) Mod 26)))
            colIndex = (colIndex - 1) \ 26
        Loop

        Return String.Join("", result.ToArray)
    End Function

    Function RemoveDuplicates(ByVal list As IEnumerable(Of Tuple(Of String, Char, Integer))) As IEnumerable(Of Tuple(Of String, Char, Integer))

        'remove those where gems and swap direction are the same
        Dim l = (From i In list Order By i.Item3 Descending, i.Item1, i.Item2).ToList
        For i = l.Count - 1 To 1 Step -1
            If (l(i).Item1 = l(i - 1).Item1) AndAlso (l(i).Item2 = l(i - 1).Item2) Then
                l.RemoveAt(i)
            End If
        Next

        l = (From i In list Order By i.Item1, i.Item3 Descending).ToList
        For i = l.Count - 1 To 1 Step -1
            If (l(i).Item1 = l(i - 1).Item1) AndAlso (l(i).Item2 = l(i - 1).Item2) Then
                l.RemoveAt(i)
            End If
        Next

        Return From i In l Order By i.Item3 Descending, i.Item1
    End Function

    Function IsMatchOnThird(ByVal input As Integer(,)) As Tuple(Of Boolean, Tuple(Of String, Char, Integer))
        Dim size = Math.Min(input.GetLength(0), 4).ToString & "C," & Math.Min(input.GetLength(1), 4).ToString & "R"
        Dim i = input
        Dim isValid = Function(test As Integer()) test.All(Function(v) v = test(0))


        Select Case size
            Case "4C,4R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, If(isValid({i(0, 0), i(0, 3)}), 4, 3)))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, If(isValid({i(1, 0), i(1, 3)}), 4, 3)))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, If(isValid({i(0, 1), i(3, 0)}), 4, 3)))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, If(isValid({i(0, 1), i(3, 1)}), 4, 3)))
                End If
            Case "4C,3R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, 3))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, 3))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, If(isValid({i(0, 1), i(3, 0)}), 4, 3)))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, If(isValid({i(0, 1), i(3, 1)}), 4, 3)))
                End If
            Case "4C,2R"
                If isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, If(isValid({i(0, 1), i(3, 0)}), 4, 3)))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, If(isValid({i(0, 1), i(3, 1)}), 4, 3)))
                End If
            Case "3C,4R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, If(isValid({i(0, 0), i(0, 3)}), 4, 3)))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, If(isValid({i(1, 0), i(1, 3)}), 4, 3)))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, 3))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, 3))
                End If
            Case "3C,3R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, 3))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, 3))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, 3))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, 3))
                End If
            Case "3C,2R"
                If isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, 3))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, 3))
                End If
            Case "2C,4R"
                If isValid({i(0, 0), i(0, 1), i(1, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,1", "L"c, If(isValid({i(0, 1), i(0, 3)}), 4, 3)))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, If(isValid({i(1, 0), i(1, 3)}), 4, 3)))
                End If
            Case "2C,3R"
                If isValid({i(0, 0), i(0, 1), i(1, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,1", "L"c, 3))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, 3))
                End If
        End Select

        Return Tuple.Create(False, Tuple.Create("None", "."c, 0))
    End Function

    Function IsMatchOnSecond(ByVal input As Integer(,)) As Tuple(Of Boolean, Tuple(Of String, Char, Integer))
        Dim i = input
        Dim isValid = Function(test As Integer()) test.All(Function(v) v = test(0))
        Dim xLength = input.GetLength(0)
        Dim yLength = input.GetLength(1)

        If xLength >= 3 AndAlso yLength >= 3 Then
            If isValid({i(0, 0), i(1, 1), i(0, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "L"c, 3))
            ElseIf isValid({i(1, 0), i(2, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("2,1", "L"c, 3))
            ElseIf isValid({i(1, 0), i(0, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("0,1", "R"c, 3))
            ElseIf isValid({i(2, 0), i(1, 1), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "R"c, 3))
            ElseIf isValid({i(0, 0), i(1, 1), i(2, 0)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "U"c, 3))
            ElseIf isValid({i(0, 1), i(1, 2), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("1,2", "U"c, 3))
            ElseIf isValid({i(0, 2), i(1, 1), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "D"c, 3))
            ElseIf isValid({i(0, 1), i(1, 0), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("1,0", "D"c, 3))
            End If
        End If

        Return Tuple.Create(False, Tuple.Create("None", "."c, 0))
    End Function

    Private Function IsMatchOnFirst(ByVal input As Integer(,)) As Tuple(Of Boolean, Tuple(Of String, Char, Integer)) '<-- New method
        Dim i = input
        Dim isValid = Function(test As Integer()) test.All(Function(v) v = test(0))
        Dim xLength = input.GetLength(0)
        Dim yLength = input.GetLength(1)

        If xLength >= 3 AndAlso yLength >= 3 Then
            If isValid({i(0, 0), i(1, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("0,0", "R"c, 3))
            ElseIf isValid({i(1, 0), i(2, 1), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,0", "R"c, 3))
            ElseIf isValid({i(2, 0), i(1, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("2,0", "L"c, 3))
            ElseIf isValid({i(1, 0), i(0, 1), i(0, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,0", "L"c, 3))
            ElseIf isValid({i(0, 0), i(1, 1), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("0,0", "D"c, 3))
            ElseIf isValid({i(0, 1), i(1, 2), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("0,1", "D"c, 3))
            ElseIf isValid({i(0, 1), i(1, 0), i(2, 0)}) Then
                Return Tuple.Create(True, Tuple.Create("0,1", "U"c, 3))
            ElseIf isValid({i(0, 2), i(1, 1), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("0,2", "U"c, 3))
            End If
        End If

        Return Tuple.Create(False, Tuple.Create("None", "."c, 0))
    End Function
End Module
模块1
副标题()
Dim输入={1,3,2,4,1,1,2,1},
{1, 2, 5, 3, 2, 1, 3, 4},
{2, 1, 5, 4, 3, 2, 5, 4},
{3, 5, 1, 5, 2, 4, 1, 2},
{4, 2, 5, 1, 5, 2, 4, 2},
{2, 3, 2, 2, 5, 1, 3, 1},
{2, 1, 5, 4, 3, 2, 5, 4},
{3, 5, 1, 3, 2, 4, 1, 2}}
Console.WriteLine(“输入:”)
控制台。写(“|”)
对于i=1,输入.GetLength(1)
Console.Write(“{0,3}”,GetColumnName(i))
下一个
控制台写入(vbCrLf)
控制台。写入(“--+”)
对于i=1,输入.GetLength(1)
控制台。写入(“--”)
下一个
控制台写入(vbCrLf)
对于y=0的输入。GetUpperBound(0)
Console.Write(“{0,3}|”,y+1)
输入x=0时。GetUpperBound(1)
Console.Write(“{0,3}”,输入(y,x))
下一个
控制台写入(vbCrLf)
下一个
WriteLine(“{0}{0}解决方案:”,vbCrLf)
对于求解(输入)中的每个匹配
WriteLine(“移动{0}{1}以匹配{2}”、match.Item1、match.Item2、match.Item3)
下一个
Console.ReadLine()
端接头
函数Solve(ByVal输入为整数(,)作为IEnumerable(元组(字符串、字符、整数))作为IEnumerable
Dim匹配为新列表(元组(字符串、字符、整数))
作为元组的Dim结果(布尔值、元组(字符串、字符、整数))
作为整数(,)的Dim测试
Dim maxX=input.GetUpperBound(0)-1
Dim maxY=input.GetUpperBound(1)-1
对于x=0到maxX
对于y=0到maxY
ReDim测试(如果(maxX-x>4,3,maxX-x),如果(maxY-y>4,3,maxY-y))
对于x1=x到x+测试。GetLength(0)-1
对于y1=y到y+测试。GetLength(1)-1
测试(x1-x,y1-y)=输入(y1,x1)
下一个
下一个
'检查结果是否匹配
对于{IsMatchOnThird(test)、IsMatchOnSecond(test)、IsMatchOnFirst(test)}0中的每个结果
结果.插入(0,Chr(65+CInt((colIndex-1)Mod 26)))
colIndex=(colIndex-1)\26
环
返回字符串.Join(“,result.ToArray)
端函数
函数removedupplicates(ByVal列表作为IEnumerable(元组(字符串、字符、整数))作为IEnumerable(元组(字符串、字符、整数))作为IEnumerable(元组)
'移除宝石和交换方向相同的宝石
Dim l=(从i开始按i.Item3降序排列,i.Item1,i.Item2)。ToList
对于i=l。计数-1到1步骤-1
如果(l(i).Item1=l(i-1).Item1)和(l(i).Item2=l(i-1).Item2),那么
l、 RemoveAt(一)
如果结束
下一个
l=(从i开始按i.Item1、i.Item3降序排列)。ToList
对于i=l。计数-1到1步骤-1
如果(l(i).Item1=l(i-1).Item1)和(l(i).Item2=l(i-1).Item2),那么
l、 RemoveAt(一)
如果结束
下一个
按i.Item3降序,i.Item1从i按l顺序返回
端函数
函数IsMatchOnThird(ByVal输入为整数(,))作为元组(布尔值,元组(字符串,字符,整数))
Dim size=Math.Min(input.GetLength(0),4).ToString和“C”以及Math.Min(input.GetLength(1,4).ToString和“R”
尺寸i=输入
Dim isValid=函数(测试为整数())test.All(函数(v)v=test(0))
选择案例大小
案例“4C,4R”
如果是有效的({i(0,0),i(0,1),i(1,2)}),那么
返回Tuple.Create(True,Tuple.Create(“1,2”,“L”c,If(isValid({i(0,0),i(0,3)}),4,3)))
ElseIf是有效的({i(1,0),i(1,1),i(0,2)})
返回Tuple.Create(True,Tuple.Create(“0,2”,“R”c,If(isValid({i(1,0),i(1,3)}),4,3)))
ElseIf是有效的({i(0,0),i(1,0),i(2,1)})
返回Tuple.Create(True,Tuple.Create(“2,1”,“U”c,If(isValid({i(0,1),i(3,0)}),4,3)))
ElseIf是有效的({i(0,1),i(1,1),i(2,0)})
返回Tuple.Create(True,Tuple.Create(“2,0”,“D”c,If(isValid({i(0,1),i(3,1)}),4,3)))
如果结束
案例“4C,3R”
如果是有效的({i(0,0),i(0,1),i(1,2)}),那么
返回Tuple.Create(True,Tuple.Create(“1,2”,“L”c,3))
ElseIf是有效的({i(1,0),i(1,1),i(0,2)})
返回Tuple.Create(True,Tuple.Create(“0,2”,“R”c,3))
ElseIf是有效的({i(0,0),i(1,0),i(2,1)})
返回Tuple.Create(True,Tuple.Create(“2,1”,“U”c,If(isValid({i(0,1),i(3,0)}),4,3)))
ElseIf是有效的({i(0,1),i(1,1),i(2,0)})
重新
_____
__0__   0 represents the line found
__0__
_X___   X represents the element that would augment the line.
_____
Module Module1

    Sub Main()
        Dim input = {{1, 3, 2, 4, 1, 1, 2, 1},
                     {1, 2, 5, 3, 2, 1, 3, 4},
                     {2, 1, 5, 4, 3, 2, 5, 4},
                     {3, 5, 1, 5, 2, 4, 1, 2},
                     {4, 2, 5, 1, 5, 2, 4, 2},
                     {2, 3, 2, 2, 5, 1, 3, 1},
                     {2, 1, 5, 4, 3, 2, 5, 4},
                     {3, 5, 1, 3, 2, 4, 1, 2}}

        Console.WriteLine("INPUT:")
        Console.Write("   |")
        For i = 1 To input.GetLength(1)
            Console.Write("{0,3}", GetColumnName(i))
        Next
        Console.Write(vbCrLf)
        Console.Write("---+")
        For i = 1 To input.GetLength(1)
            Console.Write("---")
        Next
        Console.Write(vbCrLf)

        For y = 0 To input.GetUpperBound(0)
            Console.Write("{0,3}|", y + 1)
            For x = 0 To input.GetUpperBound(1)
                Console.Write("{0,3}", input(y, x))
            Next
            Console.Write(vbCrLf)
        Next

        Console.WriteLine("{0}{0}SOLUTION:", vbCrLf)
        For Each match In Solve(input)
            Console.WriteLine("Move {0} {1} for a match of {2}", match.Item1, match.Item2, match.Item3)
        Next
        Console.ReadLine()
    End Sub

    Function Solve(ByVal input As Integer(,)) As IEnumerable(Of Tuple(Of String, Char, Integer))
        Dim matches As New List(Of Tuple(Of String, Char, Integer))
        Dim result As Tuple(Of Boolean, Tuple(Of String, Char, Integer))
        Dim test As Integer(,)

        Dim maxX = input.GetUpperBound(0) - 1
        Dim maxY = input.GetUpperBound(1) - 1

        For x = 0 To maxX
            For y = 0 To maxY
                ReDim test(If(maxX - x > 4, 3, maxX - x), If(maxY - y > 4, 3, maxY - y))
                For x1 = x To x + test.GetLength(0) - 1
                    For y1 = y To y + test.GetLength(1) - 1
                        test(x1 - x, y1 - y) = input(y1, x1)
                    Next
                Next

                'check if the result is a match
                For Each result In {IsMatchOnThird(test), IsMatchOnSecond(test), IsMatchOnFirst(test)}  '<-- Updated Line
                    If result.Item1 = True Then
                        Dim matchPoint = Tuple.Create(CInt(result.Item2.Item1.Split(","c)(0)),
                                                      CInt(result.Item2.Item1.Split(","c)(1)))

                        matches.Add(Tuple.Create(GetColumnName(matchPoint.Item1 + x + 1) & CStr(matchPoint.Item2 + y + 1),
                                                 result.Item2.Item2, result.Item2.Item3))
                    End If
                Next
            Next
        Next

        Return RemoveDuplicates(matches)
    End Function

   Public Function GetColumnName(ByVal colIndex As Integer) As String
        Dim result As New List(Of String)

        Do While colIndex > 0
            result.Insert(0, Chr(65 + CInt((colIndex - 1) Mod 26)))
            colIndex = (colIndex - 1) \ 26
        Loop

        Return String.Join("", result.ToArray)
    End Function

    Function RemoveDuplicates(ByVal list As IEnumerable(Of Tuple(Of String, Char, Integer))) As IEnumerable(Of Tuple(Of String, Char, Integer))

        'remove those where gems and swap direction are the same
        Dim l = (From i In list Order By i.Item3 Descending, i.Item1, i.Item2).ToList
        For i = l.Count - 1 To 1 Step -1
            If (l(i).Item1 = l(i - 1).Item1) AndAlso (l(i).Item2 = l(i - 1).Item2) Then
                l.RemoveAt(i)
            End If
        Next

        l = (From i In list Order By i.Item1, i.Item3 Descending).ToList
        For i = l.Count - 1 To 1 Step -1
            If (l(i).Item1 = l(i - 1).Item1) AndAlso (l(i).Item2 = l(i - 1).Item2) Then
                l.RemoveAt(i)
            End If
        Next

        Return From i In l Order By i.Item3 Descending, i.Item1
    End Function

    Function IsMatchOnThird(ByVal input As Integer(,)) As Tuple(Of Boolean, Tuple(Of String, Char, Integer))
        Dim size = Math.Min(input.GetLength(0), 4).ToString & "C," & Math.Min(input.GetLength(1), 4).ToString & "R"
        Dim i = input
        Dim isValid = Function(test As Integer()) test.All(Function(v) v = test(0))


        Select Case size
            Case "4C,4R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, If(isValid({i(0, 0), i(0, 3)}), 4, 3)))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, If(isValid({i(1, 0), i(1, 3)}), 4, 3)))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, If(isValid({i(0, 1), i(3, 0)}), 4, 3)))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, If(isValid({i(0, 1), i(3, 1)}), 4, 3)))
                End If
            Case "4C,3R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, 3))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, 3))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, If(isValid({i(0, 1), i(3, 0)}), 4, 3)))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, If(isValid({i(0, 1), i(3, 1)}), 4, 3)))
                End If
            Case "4C,2R"
                If isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, If(isValid({i(0, 1), i(3, 0)}), 4, 3)))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, If(isValid({i(0, 1), i(3, 1)}), 4, 3)))
                End If
            Case "3C,4R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, If(isValid({i(0, 0), i(0, 3)}), 4, 3)))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, If(isValid({i(1, 0), i(1, 3)}), 4, 3)))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, 3))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, 3))
                End If
            Case "3C,3R"
                If isValid({i(0, 0), i(0, 1), i(1, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,2", "L"c, 3))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, 3))
                ElseIf isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, 3))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, 3))
                End If
            Case "3C,2R"
                If isValid({i(0, 0), i(1, 0), i(2, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,1", "U"c, 3))
                ElseIf isValid({i(0, 1), i(1, 1), i(2, 0)}) Then
                    Return Tuple.Create(True, Tuple.Create("2,0", "D"c, 3))
                End If
            Case "2C,4R"
                If isValid({i(0, 0), i(0, 1), i(1, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,1", "L"c, If(isValid({i(0, 1), i(0, 3)}), 4, 3)))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, If(isValid({i(1, 0), i(1, 3)}), 4, 3)))
                End If
            Case "2C,3R"
                If isValid({i(0, 0), i(0, 1), i(1, 1)}) Then
                    Return Tuple.Create(True, Tuple.Create("1,1", "L"c, 3))
                ElseIf isValid({i(1, 0), i(1, 1), i(0, 2)}) Then
                    Return Tuple.Create(True, Tuple.Create("0,2", "R"c, 3))
                End If
        End Select

        Return Tuple.Create(False, Tuple.Create("None", "."c, 0))
    End Function

    Function IsMatchOnSecond(ByVal input As Integer(,)) As Tuple(Of Boolean, Tuple(Of String, Char, Integer))
        Dim i = input
        Dim isValid = Function(test As Integer()) test.All(Function(v) v = test(0))
        Dim xLength = input.GetLength(0)
        Dim yLength = input.GetLength(1)

        If xLength >= 3 AndAlso yLength >= 3 Then
            If isValid({i(0, 0), i(1, 1), i(0, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "L"c, 3))
            ElseIf isValid({i(1, 0), i(2, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("2,1", "L"c, 3))
            ElseIf isValid({i(1, 0), i(0, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("0,1", "R"c, 3))
            ElseIf isValid({i(2, 0), i(1, 1), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "R"c, 3))
            ElseIf isValid({i(0, 0), i(1, 1), i(2, 0)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "U"c, 3))
            ElseIf isValid({i(0, 1), i(1, 2), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("1,2", "U"c, 3))
            ElseIf isValid({i(0, 2), i(1, 1), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,1", "D"c, 3))
            ElseIf isValid({i(0, 1), i(1, 0), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("1,0", "D"c, 3))
            End If
        End If

        Return Tuple.Create(False, Tuple.Create("None", "."c, 0))
    End Function

    Private Function IsMatchOnFirst(ByVal input As Integer(,)) As Tuple(Of Boolean, Tuple(Of String, Char, Integer)) '<-- New method
        Dim i = input
        Dim isValid = Function(test As Integer()) test.All(Function(v) v = test(0))
        Dim xLength = input.GetLength(0)
        Dim yLength = input.GetLength(1)

        If xLength >= 3 AndAlso yLength >= 3 Then
            If isValid({i(0, 0), i(1, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("0,0", "R"c, 3))
            ElseIf isValid({i(1, 0), i(2, 1), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,0", "R"c, 3))
            ElseIf isValid({i(2, 0), i(1, 1), i(1, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("2,0", "L"c, 3))
            ElseIf isValid({i(1, 0), i(0, 1), i(0, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("1,0", "L"c, 3))
            ElseIf isValid({i(0, 0), i(1, 1), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("0,0", "D"c, 3))
            ElseIf isValid({i(0, 1), i(1, 2), i(2, 2)}) Then
                Return Tuple.Create(True, Tuple.Create("0,1", "D"c, 3))
            ElseIf isValid({i(0, 1), i(1, 0), i(2, 0)}) Then
                Return Tuple.Create(True, Tuple.Create("0,1", "U"c, 3))
            ElseIf isValid({i(0, 2), i(1, 1), i(2, 1)}) Then
                Return Tuple.Create(True, Tuple.Create("0,2", "U"c, 3))
            End If
        End If

        Return Tuple.Create(False, Tuple.Create("None", "."c, 0))
    End Function
End Module
Imports System.Collections.Generic

Public Class Tuple(Of T1, T2, T3)
    Inherits Tuple(Of T1, T2)
    Implements IEqualityComparer(Of Tuple(Of T1, T2, T3))

    Private _third As T3

    Public Sub New(ByVal item1 As T1, ByVal item2 As T2, ByVal item3 As T3)
        MyBase.New(item1, item2)
        _third = item3
    End Sub

    Public Property Item3() As T3
        Get
            Return _third
        End Get
        Private Set(ByVal value As T3)
            _third = value
        End Set
    End Property

    Public Overloads Function Equals(ByVal x As Tuple(Of T1, T2, T3), ByVal y As Tuple(Of T1, T2, T3)) As Boolean Implements IEqualityComparer(Of Tuple(Of T1, T2, T3)).Equals
        Return EqualityComparer(Of T1).[Default].Equals(x.Item1, y.Item1) AndAlso EqualityComparer(Of T2).[Default].Equals(x.Item2, y.Item2) AndAlso EqualityComparer(Of T3).[Default].Equals(x.Item3, y.Item3)
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return TypeOf obj Is Tuple(Of T1, T2, T3) AndAlso Equals(Me, DirectCast(obj, Tuple(Of T1, T2, T3)))
    End Function

    Public Overloads Function GetHashCode(ByVal obj As Tuple(Of T1, T2, T3)) As Integer Implements IEqualityComparer(Of Tuple(Of T1, T2, T3)).GetHashCode
        Return EqualityComparer(Of T1).[Default].GetHashCode(Item1) Xor EqualityComparer(Of T2).[Default].GetHashCode(Item2) Xor EqualityComparer(Of T3).[Default].GetHashCode(Item3)
    End Function

    Public Shared Shadows Operator =(ByVal left As Tuple(Of T1, T2, T3), ByVal right As Tuple(Of T1, T2, T3)) As Boolean
        If DirectCast(left, Object) Is Nothing AndAlso DirectCast(right, Object) Is Nothing Then
            Return True
        End If

        Return left.Equals(right)
    End Operator

    Public Shared Shadows Operator <>(ByVal left As Tuple(Of T1, T2, T3), ByVal right As Tuple(Of T1, T2, T3)) As Boolean
        If DirectCast(left, Object) Is Nothing AndAlso DirectCast(right, Object) Is Nothing Then
            Return False
        End If

        Return Not left.Equals(right)
    End Operator
End Class

Public Class Tuple(Of T1, T2)
    Implements IEqualityComparer(Of Tuple(Of T1, T2))

    Public Property Item1() As T1
        Get
            Return _first
        End Get
        Private Set(ByVal value As T1)
            _first = value
        End Set
    End Property
    Private _first As T1

    Public Property Item2() As T2
        Get
            Return _second
        End Get
        Private Set(ByVal value As T2)
            _second = value
        End Set
    End Property
    Private _second As T2

    Public Sub New(ByVal item1 As T1, ByVal item2 As T2)
        _first = item1
        _second = item2
    End Sub

    Public Overloads Function Equals(ByVal x As Tuple(Of T1, T2), ByVal y As Tuple(Of T1, T2)) As Boolean Implements IEqualityComparer(Of Tuple(Of T1, T2)).Equals
        Return EqualityComparer(Of T1).[Default].Equals(x.Item1, y.Item1) AndAlso EqualityComparer(Of T2).[Default].Equals(x.Item2, y.Item2)
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return TypeOf obj Is Tuple(Of T1, T2) AndAlso Equals(Me, DirectCast(obj, Tuple(Of T1, T2)))
    End Function

    Public Overloads Function GetHashCode(ByVal obj As Tuple(Of T1, T2)) As Integer Implements IEqualityComparer(Of Tuple(Of T1, T2)).GetHashCode
        Return EqualityComparer(Of T1).[Default].GetHashCode(Item1) Xor EqualityComparer(Of T2).[Default].GetHashCode(Item2)
    End Function

    Public Shared Operator =(ByVal left As Tuple(Of T1, T2), ByVal right As Tuple(Of T1, T2)) As Boolean
        If DirectCast(left, Object) Is Nothing AndAlso DirectCast(right, Object) Is Nothing Then
            Return True
        End If

        Return left.Equals(right)
    End Operator

    Public Shared Operator <>(ByVal left As Tuple(Of T1, T2), ByVal right As Tuple(Of T1, T2)) As Boolean
        If DirectCast(left, Object) Is Nothing AndAlso DirectCast(right, Object) Is Nothing Then
            Return False
        End If

        Return Not left.Equals(right)
    End Operator
End Class

Public MustInherit Class Tuple
    <DebuggerStepThrough()> _
    Public Shared Function Create(Of T1, T2)(ByVal first As T1, ByVal second As T2) As Tuple(Of T1, T2)
        Return New Tuple(Of T1, T2)(first, second)
    End Function

    <DebuggerStepThrough()> _
    Public Shared Function Create(Of T1, T2, T3)(ByVal first As T1, ByVal second As T2, ByVal third As T3) As Tuple(Of T1, T2, T3)
        Return New Tuple(Of T1, T2, T3)(first, second, third)
    End Function

End Class
INPUT: | A B C D E F G H ---+------------------------ 1| 1 3 2 4 1 1 2 1 2| 1 2 5 3 2 1 3 4 3| 2 1 5 4 3 2 5 4 4| 3 5 1 5 2 4 1 2 5| 4 2 5 1 5 2 4 2 6| 2 3 2 2 5 1 3 1 7| 2 1 5 4 3 2 5 4 8| 3 5 1 3 2 4 1 2 SOLUTION: Move B4 R for a match of 4 Move D4 L for a match of 4 Move B3 L for a match of 3 Move B5 D for a match of 3 Move C3 D for a match of 3 Move C5 U for a match of 3 Move D4 D for a match of 3 Move E4 R for a match of 3 Move F3 L for a match of 3 5, 2, 5 2, 5, 3 1, 5, 4