Метод грубой силы, который обрабатывает головоломку в памяти, требует 588.03 Seconds(s)
для обработки вашей головоломки и 212.79 Seconds(s)
для этой головоломки . Мой игровой компьютер, вероятно, будет обрабатывать меньше половины времени.
Sub SolveCrossSum()
Dim t As Double: t = Timer
Dim n1 As Long, n2 As Long, n3 As Long, n4 As Long, n5 As Long, n6 As Long, n7 As Long, n8 As Long, n9 As Long
Dim Data() As Variant
Dim result As String
With Worksheets("Sheet3")
Data = .Range("A1:G7").Value
For n1 = 1 To 9
For n2 = 1 To 9
For n3 = 1 To 9
For n4 = 1 To 9
For n5 = 1 To 9
For n6 = 1 To 9
For n7 = 1 To 9
For n8 = 1 To 9
For n9 = 1 To 9
If Solved(Data, t, n1, n2, n3, n4, n5, n6, n7, n8, n9) Then
.Range("A1:E5").Value = Data
Debug.Print "Cross Sum was solved in: "; Round((Timer - t), 2); " Seconds(s)"
Exit Sub
End If
Next
Next
Next
Next
Next
Next
Next
Next
Next
End With
Debug.Print "No Answer Found for Cross Sum. Execution Time: "; Round((Timer - t) / 60, 2); " Minutes(s)"
Debug.Print n1, n2, n3, n4, n5, n6, n7, n8, n9
End Sub
Function Solved(ByRef Data() As Variant, t As Double, n1 As Long, n2 As Long, n3 As Long, n4 As Long, n5 As Long, n6 As Long, n7 As Long, n8 As Long, n9 As Long) As Boolean
If hasDuplicates(n1, n2, n3, n4, n5, n6, n7, n8, n9) Then Exit Function
If ev(ev(n1, n2, Data(1, 2)), n3, Data(1, 4)) <> Data(1, 7) Then Exit Function
If ev(ev(n4, n5, Data(3, 2)), n6, Data(3, 4)) <> Data(3, 7) Then Exit Function
If ev(ev(n7, n8, Data(5, 2)), n9, Data(5, 4)) <> Data(5, 7) Then Exit Function
If ev(ev(n1, n4, Data(2, 1)), n7, Data(4, 1)) <> Data(7, 1) Then Exit Function
If ev(ev(n2, n5, Data(2, 3)), n8, Data(4, 3)) <> Data(7, 3) Then Exit Function
If ev(ev(n3, n6, Data(2, 5)), n9, Data(4, 5)) <> Data(7, 5) Then Exit Function
Data(1, 1) = n1
Data(1, 3) = n2
Data(1, 5) = n3
Data(3, 1) = n4
Data(3, 3) = n5
Data(3, 5) = n6
Data(5, 1) = n7
Data(5, 3) = n8
Data(5, 5) = n9
Solved = True
End Function
Function ev(v1 As Long, v2 As Long, operator As Variant) As Long
Select Case operator
Case "+"
ev = v1 + v2
Case "-"
ev = v1 - v2
Case "/"
ev = v1 / v2
Case "*"
ev = v1 * v2
End Select
End Function
Function hasDuplicates(ParamArray Args() As Variant) As Boolean
Dim n1 As Long, n2 As Long
For n1 = 0 To UBound(Args)
If Args(n1) = 10 Then Exit Function
For n2 = 0 To UBound(Args)
If n1 <> n2 Then
If Args(n1) = Args(n2) Then
hasDuplicates = True
Exit Function
End If
End If
Next
Next
End Function