' Generates Semi Magic Squares of Subtraction (9 x 9)
' Part II, Resulting Magic Diagonals
' Tested with Office 365 under Windows 10
Sub CnstrSqrs9b()
Dim a(81), a0(9, 9), a1(9), a2(9), s(20)
Dim n(9, 2)
Dim a3(9, 9), a4(9, 9), a5(20), d1(9), d2(9)
Dim b(81), Line9(9)
y = MsgBox("Blocked", vbExclamation, "CnstrSqrs9b")
End
Sheets("Klad1").Select
n1 = 0: n9 = 0: k1 = 1: k2 = 1
ShtNm1 = "SemiLns9"
ShtNm2 = "ScrSht9"
t1 = Timer
For j100 = 1 To 2
For i1 = 1 To 81
a(i1) = Sheets(ShtNm1).Cells(j100, i1).Value
Next i1
s1 = 369
Res9 = 41
' Check Possible Diagonals
GoSub 200: If fl1 = 0 Then GoTo 5 'Write Sets 'ScrSht9'
GoSub 400: If n29 = 0 Then GoTo 5 'Check Valid Sets
'' n9 = n9 + 1: GoSub 750 'Print Semi Magic Squares
'Related number of Magic Squares Shown (n29)
5
1000 Next j100
t2 = Timer
t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
y = MsgBox(t10, 0, "Routine CnstrSqrs9b")
End
' Check Possibility Diagonals (Magic)
200 fl1 = 1
i2 = 1: i3 = 0
For i1 = 1 To 81:
i3 = i3 + 1: If i3 = 10 Then i3 = 1: i2 = i2 + 1
a3(i2, i3) = a(i1)
Next i1
i190 = 0
For i11 = 1 To 9
For i12 = 1 To 9
If i12 = i11 Then GoTo 220
For i13 = 1 To 9
If i13 = i11 Or i13 = i12 Then GoTo 230
For i14 = 1 To 9
If i14 = i11 Or i14 = i12 Or i14 = i13 Then GoTo 240
For i15 = 1 To 9
If i15 = i11 Or i15 = i12 Or i15 = i13 Or i15 = i14 Then GoTo 250
For i16 = 1 To 9
If i16 = i11 Or i16 = i12 Or i16 = i13 Or i16 = i14 Or i16 = i15 Then GoTo 260
For i17 = 1 To 9
If i17 = i11 Or i17 = i12 Or i17 = i13 Or i17 = i14 Or i17 = i15 Or i17 = i16 Then GoTo 270
For i18 = 1 To 9
If i18 = i11 Or i18 = i12 Or i18 = i13 Or i18 = i14 Or i18 = i15 Or i18 = i16 Or i18 = i17 Then GoTo 280
For i19 = 1 To 9
If i19 = i11 Or i19 = i12 Or i19 = i13 Or i19 = i14 Or i19 = i15 Or i19 = i16 Or i19 = i17 Or i19 = i18 Then GoTo 290
s11 = a3(1, i11) + a3(2, i12) + a3(3, i13) + a3(4, i14) + a3(5, i15) + a3(6, i16) + a3(7, i17) + a3(8, i18) + a3(9, i19)
If s11 <> s1 Then GoTo 290
Erase b, Line9
b(a3(1, i11)) = a3(1, i11)
b(a3(2, i12)) = a3(2, i12)
b(a3(3, i13)) = a3(3, i13)
b(a3(4, i14)) = a3(4, i14)
b(a3(5, i15)) = a3(5, i15)
b(a3(6, i16)) = a3(6, i16)
b(a3(7, i17)) = a3(7, i17)
b(a3(8, i18)) = a3(8, i18)
b(a3(9, i19)) = a3(9, i19)
q2 = 0
For q1 = 1 To 81
If b(q1) = q1 Then
q2 = q2 + 1: Line9(q2) = q1
End If
Next q1
s12 = Line9(9) - Line9(8) + Line9(7) - Line9(6) + Line9(5) - Line9(4) + Line9(3) - Line9(2) + Line9(1)
If s12 <> Res9 Then GoTo 290
i190 = i190 + 1
Sheets(ShtNm2).Cells(i190, 11).Value = a3(1, i11)
Sheets(ShtNm2).Cells(i190, 12).Value = a3(2, i12)
Sheets(ShtNm2).Cells(i190, 13).Value = a3(3, i13)
Sheets(ShtNm2).Cells(i190, 14).Value = a3(4, i14)
Sheets(ShtNm2).Cells(i190, 15).Value = a3(5, i15)
Sheets(ShtNm2).Cells(i190, 16).Value = a3(6, i16)
Sheets(ShtNm2).Cells(i190, 17).Value = a3(7, i17)
Sheets(ShtNm2).Cells(i190, 18).Value = a3(8, i18)
Sheets(ShtNm2).Cells(i190, 19).Value = a3(9, i19)
290 Next i19
280 Next i18
270 Next i17
260 Next i16
250 Next i15
240 Next i14
230 Next i13
220 Next i12
210 Next i11
If i190 < 2 Then fl1 = 0: Return
n19 = 0
For j11 = 1 To i190
n20 = 9: Erase a5
For i1 = 1 To 9
a1(i1) = Sheets(ShtNm2).Cells(j11, i1 + 10).Value
Next i1
For i1 = 1 To 9 'First Line
a5(i1) = a1(i1)
Next i1
For j12 = j11 + 1 To i190
j300 = j12: GoSub 300: If fl2 = 0 Then GoTo 120
' Write Set Diagonals to 'ScrSht9'
For i1 = 1 To 2
n19 = n19 + 1
For i2 = 1 To 9
Sheets(ShtNm2).Cells(n19, i2 + 20).Value = a5(i2 + (i1 - 1) * 9)
Next i2
Sheets(ShtNm2).Cells(n19, 10 + 20).Value = i1
Next i1
n20 = n20 - 9
120 Next j12
n20 = n20 - 9
110 Next j11
If n19 < 2 Then fl1 = 0
Return
' Construct Magic Set Diagonals
300 fl2 = 1
For i1 = 1 To 9
a2(i1) = Sheets(ShtNm2).Cells(j300, i1 + 10).Value
Next i1
n22 = 0
For i1 = 1 To 9
a20 = a2(i1)
For i2 = 1 To n20
If a20 = a5(i2) Then n22 = n22 + 1: i21 = i1: i22 = i2
Next i2
Next i1
If n22 <> 1 Then fl2 = 0: Return 'Only one common allowed
' One Element Common (Center) ok
n20 = n20 + 9: i22 = i22 + 9
i2 = 0
For i1 = n20 - 9 + 1 To n20
i2 = i2 + 1
a5(i1) = a2(i2)
Next i1
Return
' Read Diagonals for Final Check
400
n29 = 0:
For j20 = 1 To n19 - 1 Step 2
For i1 = 1 To 9
d1(i1) = Sheets(ShtNm2).Cells(j20, i1 + 20).Value
d2(i1) = Sheets(ShtNm2).Cells(j20 + 1, i1 + 20).Value
Next i1
Erase a4
For i1 = 1 To 9
For i2 = 1 To 9
If a3(i1, i2) = d1(i1) Then a4(i1, i2) = 1
If a3(i1, i2) = d2(i1) Then a4(i1, i2) = 2
Next i2
Next i1
GoSub 450 'Check if transformation is possible
If fl1 = 1 Then
n29 = n29 + 1
' Print Semi Magic Squares
' Required Transformation Highlighted
n9 = n9 + 1: GoSub 650
End If
Next j20
Return
' Check if transformation is possible
450 fl1 = 1
For i1 = 1 To 9 'rows
n21 = 0: i41 = 0: i42 = 0
For i2 = 1 To 9 'clmns
If a4(i1, i2) <> 0 Then
n21 = n21 + 1
If n21 = 1 Then i41 = i2 Else i42 = i2
End If
Next i2
If i41 = 0 Or i42 = 0 Then GoTo 460
For i3 = i1 + 1 To 9
If a4(i3, i41) = 0 And a4(i3, i42) = 0 Then
'continue
Else
If a4(i3, i41) = a4(i1, i42) And a4(i3, i42) = a4(i1, i41) Then
Exit For 'ok
Else
fl1 = 0: Return 'no match
End If
End If
Next i3
460 Next i1
Return
' Print Semi Magic Squares
' Required Transformation Highlighted
650 n2 = n2 + 1
If n2 = 5 Then
n2 = 1: k1 = k1 + 10: k2 = 1
Else
If n9 > 1 Then k2 = k2 + 10
End If
Cells(k1, k2 + 1).Select
Cells(k1, k2 + 1).Font.Color = -4165632
Cells(k1, k2 + 1).Value = Nc9 ''n9
Cells(k1, k2 + 2).Value = n29
Cells(k1, k2 + 7).Value = j100 'Generator Magic Lines
i3 = 0
For i1 = 1 To 9
For i2 = 1 To 9
i3 = i3 + 1
Cells(k1 + i1, k2 + i2).Value = a(i3)
Select Case a4(i1, i2)
Case 1
Range(Cells(k1 + i1, k2 + i2), Cells(k1 + i1, k2 + i2)).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With
Case 2
Range(Cells(k1 + i1, k2 + i2), Cells(k1 + i1, k2 + i2)).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent5
.TintAndShade = 0.599993896298105
.PatternTintAndShade = 0
End With
Case 0
End Select
Next i2
Next i1
Return
End Sub