Imports System.Collections

Public Class Grid
    
Private intGridArray As Integer()
    
Private intValueGridCount As Integer
    
Private intGridCount As Integer
    
Private intNumberQueue As New Queue
    
Private intRowAverage As Integer
    
Private ResultCount As Integer
    
Private TimeInterval As DateTime = Now
    
Private intSumGridCount As Integer
    
Private intLastRowStartBound As Integer

    
Sub New()
        intGridCount 
= 3
        intSumGridCount 
= intGridCount * intGridCount
        intLastRowStartBound 
= intSumGridCount - intGridCount
        intGridArray 
= New Integer(intSumGridCount - 1) {}

        
' 初始化队列
        Dim i As Integer
        
For i = 1 To intSumGridCount
            intNumberQueue.Enqueue(i)
        
Next

        
' 计算平均值
        Dim sum As Integer = 0
        
Dim myStandardArray As Object() = intNumberQueue.ToArray()
        
For i = 0 To myStandardArray.GetUpperBound(0)
            sum 
+= CType(myStandardArray(i), Integer)
        
Next
        intRowAverage 
= sum \ intGridCount
    
End Sub


    
Sub New(ByVal inputGridCount As Integer)
        intGridCount 
= inputGridCount
        intSumGridCount 
= intGridCount * intGridCount
        intLastRowStartBound 
= intSumGridCount - intGridCount
        intGridArray 
= New Integer(intSumGridCount - 1) {}

        
' 初始化队列
        Dim i As Integer
        
For i = 1 To intSumGridCount
            intNumberQueue.Enqueue(i)
        
Next

        
' 计算平均值
        Dim sum As Integer = 0
        
Dim myStandardArray As Object() = intNumberQueue.ToArray()
        
For i = 0 To myStandardArray.GetUpperBound(0)
            sum 
+= CType(myStandardArray(i), Integer)
        
Next
        intRowAverage 
= sum \ intGridCount
    
End Sub



    
Sub Sort()
        
Dim intFirstNum As Integer
        
Dim intTempQueue As Queue

        
' 从队列取数, 数组底数加1, 克隆队列用于当前层次的递归
        intValueGridCount += 1
        intGridArray(intValueGridCount 
- 1= CType(intNumberQueue.Dequeue, Integer)
        intFirstNum 
= intGridArray(intValueGridCount - 1)
        intTempQueue 
= intNumberQueue.Clone

        
' 循环队列中的数
        Do
            
' 通过则记住当前队列状态, 用于进入递归
            If Check() AndAlso intValueGridCount <> intSumGridCount Then
                intNumberQueue 
= intTempQueue.Clone
                Sort()
            
End If

            
' 入列出列
            intTempQueue.Enqueue(intGridArray(intValueGridCount - 1))
            intGridArray(intValueGridCount 
- 1= CType(intTempQueue.Dequeue, Integer)
        
Loop Until intFirstNum = intGridArray(intValueGridCount - 1)

        
' 本次递归结束, 数组底组减1, 跳到上层的循环体继续
        intValueGridCount -= 1
    
End Sub


    
Function Check() As Boolean
        
' 最后一行
        If intValueGridCount > intLastRowStartBound Then

            
If Not Calculate("|"Then
                
Return False
            
End If

            
' 最后一行第一的数字
            If intValueGridCount Mod intGridCount = 1 Then
                
If Not Calculate("/"Then
                    
Return False
                
End If
            
End If

            
' 最后一个数字
            If intValueGridCount = intSumGridCount Then
                
If Not (Calculate("--"AndAlso Calculate("\")) Then
                    
Return False
                
Else
                    ResultCount 
+= 1
                    Display()
                
End If
            
End If

            
' 如果所有测试通过
            Return True

        
Else ' 非最后一行
            If intValueGridCount Mod intGridCount = 0 Then
                
Return Calculate("--")
            
End If

            
' 没有凑齐一行
            Return True
        
End If
    
End Function


    
Sub Display()
        
Dim i, j As Integer
        
Dim strLine, str As String
        
Dim intOutputLen As Integer = 3

        Console.
WriteLine("" & ResultCount & "个结果用时: " & Now.Subtract(TimeInterval).TotalSeconds.ToString & " 秒")

        
'生成标头
        For i = 0 To intGridCount - 1
            
For j = 1 To intOutputLen
                strLine 
&= "-"
            Next
            strLine 
= strLine & "+"
        Next

        
'打印每个维度的数据
        For i = 0 To intGridCount - 1
            Console.
WriteLine("+" & strLine)

            
For j = 0 To intGridCount - 1
                
str &= intGridArray(i * intGridCount + j).ToString.PadLeft(intOutputLen) & "|"
            Next

            Console.
WriteLine("|" & str)
            
str = ""
        Next

        Console.
WriteLine("+" & strLine)
        Console.
WriteLine("")
    
End Sub


    
' 计算宫格某个方向的数值之和
    Function Calculate(ByVal aspect As StringAs Boolean
        
Dim sum As Integer = 0
        
Dim i, j As Integer

        
Select Case aspect
            
Case "|"
                For i = 0 To intGridCount - 1
                    sum 
+= intGridArray(intValueGridCount - i * intGridCount - 1)
                
Next

                
If intRowAverage = sum Then
                    
Return True
                
Else
                    
Return False
                
End If
            
Case "/"
                j = 0
                
For i = 0 To intGridCount - 1
                    sum 
+= intGridArray(intValueGridCount - i * intGridCount - 1 + j)
                    j 
+= 1
                
Next

                
If intRowAverage = sum Then
                    
Return True
                
Else
                    
Return False
                
End If
            
Case "\"
                j = 0
                
For i = 0 To intGridCount - 1
                    sum 
+= intGridArray(intValueGridCount - i * intGridCount - 1 - j)
                    j 
+= 1
                
Next

                
If intRowAverage = sum Then
                    
Return True
                
Else
                    
Return False
                
End If
            
Case "--"
                For i = 0 To intGridCount - 1
                    sum 
+= intGridArray(intValueGridCount - i - 1)
                
Next

                
If intRowAverage = sum Then
                    
Return True
                
Else
                    
Return False
                
End If
        
End Select
    
End Function

End Class


维度为4时:
posted on 2005-08-12 09:53  waxwork3  阅读(1691)  评论(4编辑  收藏  举报