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 String) As 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
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 String) As 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时: