Vorige Pagina About the Author

' Generates SelfOrthogonal Latin Diagonal Squares (9 x 9)
' Associated (Idempotent Squares)

' Tested with Office 365 under Windows 11

Sub SelfOrth9a()

Dim a(81), b(9), a1(9)
Dim b2(81), c2(81), a0(9, 9)
Dim s(32)

y = MsgBox("Locked", vbCritical, "Routine SelfOrth9a")
End

n2 = 0: n9 = 0: k1 = 1: k2 = 1
m1 = 1: m2 = 9: s1 = 36: Pr9 = 2 * s1 / 9

For i1 = 1 To 9: a1(i1) = i1 - 1: Next i1
   
    Sheets("Klad1").Select
    
    t1 = Timer

    GoSub 1700                                                   'Initialise diiagonal a()
    
'   Row 1/9
   
For j80 = m1 To m2
    a(80) = a1(j80)
    If a(80) = a(81) Or a(80) = a(71) Then GoTo 800

    a(2) = Pr9 - a(80)
    If a(2) = a(1) Or a(2) = a(11) Then GoTo 20

For j79 = m1 To m2
    a(79) = a1(j79)
    If a(79) = a(81) Or a(79) = a(61) Then GoTo 790
    If a(79) = a(80) Then GoTo 790

    a(3) = Pr9 - a(79)
    If a(3) = a(1) Or a(3) = a(21) Then GoTo 30
    If a(3) = a(2) Then GoTo 30

For j78 = m1 To m2
    a(78) = a1(j78)
    If a(78) = a(81) Or a(78) = a(51) Then GoTo 780
    If a(78) = a(80) Or a(78) = a(79) Then GoTo 780

    a(4) = Pr9 - a(78)
    If a(4) = a(1) Or a(4) = a(31) Then GoTo 40
    If a(4) = a(2) Or a(4) = a(3) Then GoTo 40

For j77 = m1 To m2
    a(77) = a1(j77)
    If a(77) = a(81) Or a(77) = a(41) Then GoTo 770
    If a(77) = a(80) Or a(77) = a(79) Or a(77) = a(78) Then GoTo 770

    a(5) = Pr9 - a(77)
    If a(5) = a(1) Or a(5) = a(41) Then GoTo 50
    If a(5) = a(2) Or a(5) = a(3) Or a(5) = a(4) Then GoTo 50

For j76 = m1 To m2
    a(76) = a1(j76)
    If a(76) = a(81) Or a(76) = a(31) Then GoTo 760
    If a(76) = a(80) Or a(76) = a(79) Or a(76) = a(78) Or a(76) = a(77) Then GoTo 760
    If a(76) = a(4) Then GoTo 760

    a(6) = Pr9 - a(76)
    If a(6) = a(1) Or a(6) = a(51) Then GoTo 60
    If a(6) = a(2) Or a(6) = a(3) Or a(6) = a(4) Or a(6) = a(5) Then GoTo 60
    If a(6) = a(78) Then GoTo 60

For j75 = m1 To m2
    a(75) = a1(j75)
    If a(75) = a(81) Or a(75) = a(21) Then GoTo 750
    If a(75) = a(80) Or a(75) = a(79) Or a(75) = a(78) Or a(75) = a(77) Or a(75) = a(76) Then GoTo 750
    If a(75) = a(3) Then GoTo 750

    a(7) = Pr9 - a(75)
    If a(7) = a(1) Or a(7) = a(61) Then GoTo 70
    If a(7) = a(2) Or a(7) = a(3) Or a(7) = a(4) Or a(7) = a(5) Or a(7) = a(6) Then GoTo 70
    If a(7) = a(79) Then GoTo 70

For j74 = m1 To m2
    a(74) = a1(j74)
    If a(74) = a(81) Or a(74) = a(11) Then GoTo 740
    If a(74) = a(80) Or a(74) = a(79) Or a(74) = a(78) Or a(74) = a(77) Or a(74) = a(76) Or a(74) = a(75) Then GoTo 740
    If a(74) = a(2) Then GoTo 740

    a(8) = Pr9 - a(74)
    If a(8) = a(1) Or a(8) = a(71) Then GoTo 80
    If a(8) = a(2) Or a(8) = a(3) Or a(8) = a(4) Or a(8) = a(5) Or a(8) = a(6) Or a(8) = a(7) Then GoTo 80
    If a(8) = a(80) Then GoTo 80

    a(73) = s1 - a(74) - a(75) - a(76) - a(77) - a(78) - a(79) - a(80) - a(81)
    If a(73) < a1(m1) Or a(73) > a1(m2) Then GoTo 730
    If a(73) = a(1) Then GoTo 730
    If a(73) = a(41) Then GoTo 730
    
    a(9) = Pr9 - a(73)
    If a(9) = a(81) Then GoTo 90

'   Column 1/9

For j72 = m1 To m2
    a(72) = a1(j72)
    If a(72) = a(81) Or a(72) = a(71) Then GoTo 720
    If a(72) = a(9) Then GoTo 720
If a(72) = a(80) Then GoTo 720

    a(10) = Pr9 - a(72)
    If a(10) = a(1) Or a(10) = a(11) Then GoTo 100
    If a(10) = a(73) Then GoTo 100
If a(10) = a(2) Then GoTo 100

For j63 = m1 To m2
    a(63) = a1(j63)
    If a(63) = a(81) Or a(63) = a(61) Then GoTo 630
    If a(63) = a(9) Or a(63) = a(72) Then GoTo 630
If a(63) = a(79) Then GoTo 630

    a(19) = Pr9 - a(63)
    If a(19) = a(1) Or a(19) = a(21) Then GoTo 190
    If a(19) = a(73) Or a(19) = a(10) Then GoTo 190
If a(19) = a(3) Then GoTo 190

For j54 = m1 To m2
    a(54) = a1(j54)
    If a(54) = a(81) Or a(54) = a(51) Then GoTo 540
    If a(54) = a(9) Or a(54) = a(72) Or a(54) = a(63) Then GoTo 540
If a(54) = a(78) Then GoTo 540

    a(28) = Pr9 - a(54)
    If a(28) = a(1) Or a(28) = a(31) Then GoTo 280
    If a(28) = a(73) Or a(28) = a(10) Or a(28) = a(19) Then GoTo 280
If a(28) = a(4) Then GoTo 280

For j45 = m1 To m2
    a(45) = a1(j45)
    If a(45) = a(81) Or a(45) = a(41) Then GoTo 450
    If a(45) = a(9) Or a(45) = a(72) Or a(45) = a(63) Or a(45) = a(54) Then GoTo 450
If a(45) = a(77) Then GoTo 450

    a(37) = Pr9 - a(45)
    If a(37) = a(1) Or a(37) = a(41) Then GoTo 370
    If a(37) = a(73) Or a(37) = a(10) Or a(37) = a(19) Or a(37) = a(28) Then GoTo 370
If a(37) = a(5) Then GoTo 370

For j36 = m1 To m2
    a(36) = a1(j36)
    If a(36) = a(81) Or a(36) = a(31) Then GoTo 360
    If a(36) = a(9) Or a(36) = a(72) Or a(36) = a(63) Or a(36) = a(54) Or a(36) = a(45) Then GoTo 360
    If a(36) = a(28) Then GoTo 360
If a(36) = a(76) Then GoTo 360

    a(46) = Pr9 - a(36)
    If a(46) = a(1) Or a(46) = a(51) Then GoTo 460
    If a(46) = a(73) Or a(46) = a(10) Or a(46) = a(19) Or a(46) = a(28) Or a(46) = a(37) Then GoTo 460
    If a(46) = a(54) Then GoTo 460
If a(46) = a(6) Then GoTo 460

For j27 = m1 To m2
    a(27) = a1(j27)
    If a(27) = a(81) Or a(27) = a(21) Then GoTo 270
    If a(27) = a(9) Or a(27) = a(72) Or a(27) = a(63) Or a(27) = a(54) Or a(27) = a(45) Or a(27) = a(36) Then GoTo 270
    If a(27) = a(19) Then GoTo 270
If a(27) = a(75) Then GoTo 270

    a(55) = Pr9 - a(27)
    If a(55) = a(1) Or a(55) = a(61) Then GoTo 550
    If a(55) = a(73) Or a(55) = a(10) Or a(55) = a(19) Or a(55) = a(28) Or a(55) = a(37) Or a(55) = a(46) Then GoTo 550
    If a(55) = a(63) Then GoTo 550
If a(55) = a(7) Then GoTo 550

    a(18) = s1 - a(9) - a(27) - a(36) - a(45) - a(54) - a(63) - a(72) - a(81)
    If a(18) < a1(m1) Or a(18) > a1(m2) Then GoTo 180
    If a(18) = a(10) Or a(18) = a(11) Then GoTo 180
If a(18) = a(74) Then GoTo 180
    
    a(64) = Pr9 - a(18)
    If a(64) = a(71) Or a(64) = a(72) Then GoTo 640
If a(64) = a(8) Then GoTo 640

GoSub 1500: If fl1 = 0 Then GoTo 640  'Check Self Orthogonal

'   Row 2/8
    
For j70 = m1 To m2
    a(70) = a1(j70)
    If a(70) = a(71) Or a(70) = a(61) Then GoTo 700
    If a(70) = a(7) Or a(70) = a(79) Then GoTo 700
    If a(70) = a(64) Or a(70) = a(72) Then GoTo 700

    a(12) = Pr9 - a(70)
    If a(12) = a(11) Or a(12) = a(21) Then GoTo 120
    If a(12) = a(3) Or a(12) = a(75) Then GoTo 120
    If a(12) = a(10) Or a(12) = a(18) Then GoTo 120

For j69 = m1 To m2
    a(69) = a1(j69)
    If a(69) = a(71) Or a(69) = a(51) Then GoTo 690
    If a(69) = a(6) Or a(69) = a(78) Then GoTo 690
    If a(69) = a(64) Or a(69) = a(72) Or a(69) = a(70) Then GoTo 690

    a(13) = Pr9 - a(69)
    If a(13) = a(11) Or a(13) = a(31) Then GoTo 130
    If a(13) = a(4) Or a(13) = a(76) Then GoTo 130
    If a(13) = a(10) Or a(13) = a(18) Or a(13) = a(12) Then GoTo 130

For j68 = m1 To m2
    a(68) = a1(j68)
    If a(68) = a(71) Or a(68) = a(41) Then GoTo 680
    If a(68) = a(5) Or a(68) = a(77) Then GoTo 680
    If a(68) = a(64) Or a(68) = a(72) Or a(68) = a(70) Or a(68) = a(69) Then GoTo 680

    a(14) = Pr9 - a(68)
    If a(14) = a(11) Or a(14) = a(41) Then GoTo 140
    If a(14) = a(5) Or a(14) = a(77) Then GoTo 140
    If a(14) = a(10) Or a(14) = a(18) Or a(14) = a(12) Or a(14) = a(13) Then GoTo 140

For j67 = m1 To m2
    a(67) = a1(j67)
    If a(67) = a(71) Or a(67) = a(31) Then GoTo 670
    If a(67) = a(4) Or a(67) = a(76) Then GoTo 670
    If a(67) = a(64) Or a(67) = a(72) Or a(67) = a(70) Or a(67) = a(69) Or a(67) = a(68) Then GoTo 670
    If a(67) = a(13) Then GoTo 670

    a(15) = Pr9 - a(67)
    If a(15) = a(11) Or a(15) = a(51) Then GoTo 150
    If a(15) = a(6) Or a(15) = a(78) Then GoTo 150
    If a(15) = a(10) Or a(15) = a(18) Or a(15) = a(12) Or a(15) = a(13) Or a(15) = a(14) Then GoTo 150
    If a(15) = a(69) Then GoTo 150

For j66 = m1 To m2
    a(66) = a1(j66)
    If a(66) = a(71) Or a(66) = a(21) Then GoTo 660
    If a(66) = a(3) Or a(66) = a(75) Then GoTo 660
    If a(66) = a(64) Or a(66) = a(72) Or a(66) = a(70) Or a(66) = a(69) Or a(66) = a(68) Or a(66) = a(67) Then GoTo 660
    If a(66) = a(12) Then GoTo 660

    a(16) = Pr9 - a(66)
    If a(16) = a(11) Or a(16) = a(61) Then GoTo 160
    If a(16) = a(7) Or a(16) = a(79) Then GoTo 160
    If a(16) = a(10) Or a(16) = a(18) Or a(16) = a(12) Or a(16) = a(13) Or a(16) = a(14) Or a(16) = a(15) Then GoTo 160
    If a(16) = a(70) Then GoTo 160

    a(65) = s1 - a(64) - a(66) - a(67) - a(68) - a(69) - a(70) - a(71) - a(72)
    If a(65) < a1(m1) Or a(65) > a1(m2) Then GoTo 650
    If a(65) = a(11) Or a(65) = a(2) Or a(65) = a(74) Then GoTo 650
    If a(65) = a(73) Or a(65) = a(41) Or a(65) = a(9) Then GoTo 650                     'Diagonal
    
    a(17) = Pr9 - a(65)
    If a(17) = a(71) Or a(17) = a(8) Or a(17) = a(80) Then GoTo 170
    If a(17) = a(73) Or a(17) = a(65) Or a(17) = a(41) Or a(17) = a(9) Then GoTo 170    'Diagonal

'   Column 2/8

For j62 = m1 To m2
    a(62) = a1(j62)
    If a(62) = a(71) Or a(62) = a(61) Then GoTo 620
    If a(62) = a(8) Or a(62) = a(80) Or a(62) = a(17) Then GoTo 620
    If a(62) = a(55) Or a(62) = a(63) Then GoTo 620
If a(62) = a(70) Then GoTo 620

    a(20) = Pr9 - a(62)
    If a(20) = a(11) Or a(20) = a(21) Then GoTo 200
    If a(20) = a(2) Or a(20) = a(74) Or a(20) = a(65) Then GoTo 200
    If a(20) = a(19) Or a(20) = a(27) Then GoTo 200
If a(20) = a(12) Then GoTo 200

For j53 = m1 To m2
    a(53) = a1(j53)
    If a(53) = a(71) Or a(53) = a(51) Then GoTo 530
    If a(53) = a(8) Or a(53) = a(80) Or a(53) = a(17) Or a(53) = a(62) Then GoTo 530
    If a(53) = a(46) Or a(53) = a(54) Then GoTo 530
If a(53) = a(69) Then GoTo 530

    a(29) = Pr9 - a(53)
    If a(29) = a(11) Or a(29) = a(31) Then GoTo 290
    If a(29) = a(2) Or a(29) = a(74) Or a(29) = a(65) Or a(29) = a(20) Then GoTo 290
    If a(29) = a(28) Or a(29) = a(36) Then GoTo 290
If a(29) = a(13) Then GoTo 290

For j44 = m1 To m2
    a(44) = a1(j44)
    If a(44) = a(71) Or a(44) = a(41) Then GoTo 440
    If a(44) = a(8) Or a(44) = a(80) Or a(44) = a(17) Or a(44) = a(62) Or a(44) = a(53) Then GoTo 440
    If a(44) = a(37) Or a(44) = a(45) Then GoTo 440
If a(44) = a(68) Then GoTo 440

    a(38) = Pr9 - a(44)
    If a(38) = a(11) Or a(38) = a(41) Then GoTo 380
    If a(38) = a(2) Or a(38) = a(74) Or a(38) = a(65) Or a(38) = a(20) Or a(38) = a(29) Then GoTo 380
    If a(38) = a(37) Or a(38) = a(44) Then GoTo 380
If a(38) = a(14) Then GoTo 380

For j35 = m1 To m2
    a(35) = a1(j35)
    If a(35) = a(71) Or a(35) = a(31) Then GoTo 350
    If a(35) = a(8) Or a(35) = a(80) Or a(35) = a(17) Or a(35) = a(62) Or a(35) = a(53) Or a(35) = a(44) Then GoTo 350
    If a(35) = a(28) Or a(35) = a(29) Or a(35) = a(36) Then GoTo 350
If a(35) = a(67) Then GoTo 350

    a(47) = Pr9 - a(35)
    If a(47) = a(11) Or a(47) = a(51) Then GoTo 470
    If a(47) = a(2) Or a(47) = a(74) Or a(47) = a(65) Or a(47) = a(20) Or a(47) = a(29) Or a(47) = a(38) Then GoTo 470
    If a(47) = a(46) Or a(47) = a(54) Or a(47) = a(53) Then GoTo 470
If a(47) = a(15) Then GoTo 470

    a(26) = s1 - a(8) - a(17) - a(35) - a(44) - a(53) - a(62) - a(71) - a(80)
    If a(26) < a1(m1) Or a(26) > a1(m2) Then GoTo 260
    If a(26) = a(19) Or a(26) = a(20) Or a(26) = a(21) Or a(26) = a(27) Then GoTo 260
If a(26) = a(66) Then GoTo 260
    
    a(56) = Pr9 - a(26)
    If a(56) = a(55) Or a(56) = a(61) Or a(56) = a(62) Or a(56) = a(63) Then GoTo 560
If a(56) = a(16) Then GoTo 560

GoSub 1500: If fl1 = 0 Then GoTo 560  'Check Self Orthogonal

'   Row 3/7
    
For j60 = m1 To m2
    a(60) = a1(j60)
    If a(60) = a(61) Or a(60) = a(51) Then GoTo 600
    If a(60) = a(6) Or a(60) = a(78) Or a(60) = a(15) Or a(60) = a(69) Then GoTo 600
    If a(60) = a(55) Or a(60) = a(63) Or a(60) = a(56) Or a(60) = a(62) Then GoTo 600

    a(22) = Pr9 - a(60)
    If a(22) = a(21) Or a(22) = a(31) Then GoTo 220
    If a(22) = a(4) Or a(22) = a(76) Or a(22) = a(13) Or a(22) = a(67) Then GoTo 220
    If a(22) = a(19) Or a(22) = a(27) Or a(22) = a(20) Or a(22) = a(26) Then GoTo 220

For j59 = m1 To m2
    a(59) = a1(j59)
    If a(59) = a(61) Or a(59) = a(41) Then GoTo 590
    If a(59) = a(5) Or a(59) = a(77) Or a(59) = a(14) Or a(59) = a(68) Then GoTo 590
    If a(59) = a(55) Or a(59) = a(63) Or a(59) = a(56) Or a(59) = a(62) Or a(59) = a(60) Then GoTo 590

    a(23) = Pr9 - a(59)
    If a(23) = a(21) Or a(23) = a(41) Then GoTo 230
    If a(23) = a(5) Or a(23) = a(77) Or a(23) = a(14) Or a(23) = a(68) Then GoTo 230
    If a(23) = a(19) Or a(23) = a(27) Or a(23) = a(20) Or a(23) = a(26) Or a(23) = a(22) Then GoTo 230

For j58 = m1 To m2
    a(58) = a1(j58)
    If a(58) = a(61) Or a(58) = a(31) Then GoTo 580
    If a(58) = a(4) Or a(58) = a(76) Or a(58) = a(13) Or a(58) = a(67) Or a(58) = a(22) Then GoTo 580
    If a(58) = a(55) Or a(58) = a(63) Or a(58) = a(56) Or a(58) = a(62) Or a(58) = a(60) Or a(58) = a(59) Then GoTo 580

    a(24) = Pr9 - a(58)
    If a(24) = a(21) Or a(24) = a(51) Then GoTo 240
    If a(24) = a(6) Or a(24) = a(78) Or a(24) = a(15) Or a(24) = a(69) Or a(24) = a(60) Then GoTo 240
    If a(24) = a(19) Or a(24) = a(27) Or a(24) = a(20) Or a(24) = a(26) Or a(24) = a(22) Or a(24) = a(23) Then GoTo 240

    a(57) = s1 - a(55) - a(56) - a(58) - a(59) - a(60) - a(61) - a(62) - a(63)
    If a(57) < a1(m1) Or a(57) > a1(m2) Then GoTo 570
    If a(57) = a(61) Or a(57) = a(21) Then GoTo 570
    If a(57) = a(3) Or a(57) = a(75) Or a(57) = a(12) Or a(57) = a(66) Then GoTo 570
        
    a(25) = Pr9 - a(57)
    If a(25) = a(21) Or a(25) = a(61) Then GoTo 250
    If a(25) = a(7) Or a(25) = a(79) Or a(25) = a(16) Or a(25) = a(70) Then GoTo 250

'   Check Diagonal
    b(1) = a(9): b(2) = a(17): b(3) = a(25): b(4) = a(41): b(5) = a(57): b(6) = a(65): b(7) = a(73):
    n81 = 7: GoSub 1860: If fl1 = 0 Then GoTo 250

'   Column 3/7

For j52 = m1 To m2
    a(52) = a1(j52)
    If a(52) = a(61) Or a(52) = a(51) Then GoTo 520
    If a(52) = a(7) Or a(52) = a(79) Or a(52) = a(16) Or a(52) = a(70) Or a(52) = a(25) Then GoTo 520
    If a(52) = a(46) Or a(52) = a(54) Or a(52) = a(47) Or a(52) = a(53) Then GoTo 520
If a(52) = a(60) Then GoTo 520

    a(30) = Pr9 - a(52)
    If a(30) = a(21) Or a(30) = a(31) Then GoTo 300
    If a(30) = a(3) Or a(30) = a(75) Or a(30) = a(12) Or a(30) = a(66) Or a(30) = a(57) Then GoTo 300
    If a(30) = a(28) Or a(30) = a(36) Or a(30) = a(29) Or a(30) = a(35) Then GoTo 300
If a(30) = a(22) Then GoTo 300

For j43 = m1 To m2
    a(43) = a1(j43)
    If a(43) = a(61) Or a(43) = a(41) Then GoTo 430
    If a(43) = a(7) Or a(43) = a(79) Or a(43) = a(16) Or a(43) = a(70) Or a(43) = a(25) Or a(43) = a(52) Then GoTo 430
    If a(43) = a(37) Or a(43) = a(45) Or a(43) = a(38) Or a(43) = a(44) Then GoTo 430
If a(43) = a(59) Then GoTo 430

    a(39) = Pr9 - a(43)
    If a(39) = a(21) Or a(39) = a(41) Then GoTo 390
    If a(39) = a(3) Or a(39) = a(75) Or a(39) = a(12) Or a(39) = a(66) Or a(39) = a(57) Or a(39) = a(30) Then GoTo 390
    If a(39) = a(37) Or a(39) = a(45) Or a(39) = a(38) Or a(39) = a(44) Then GoTo 390
If a(39) = a(23) Then GoTo 390

    a(34) = s1 - a(7) - a(16) - a(25) - a(43) - a(52) - a(61) - a(70) - a(79)
    If a(34) < a1(m1) Or a(34) > a1(m2) Then GoTo 340

    b(1) = a(28): b(2) = a(29): b(3) = a(30): b(4) = a(31): b(5) = a(34): b(6) = a(35): b(7) = a(36):
    n81 = 7: GoSub 1860: If fl1 = 0 Then GoTo 340

    If a(34) = a(58) Then GoTo 340
    
    a(48) = Pr9 - a(34)

    b(1) = a(46): b(2) = a(47): b(3) = a(48): b(4) = a(51): b(5) = a(52): b(6) = a(53): b(7) = a(54):
    n81 = 7: GoSub 1860: If fl1 = 0 Then GoTo 480

    If a(48) = a(24) Then GoTo 480

GoSub 1500: If fl1 = 0 Then GoTo 480  'Check Self Orthogonal

For j49 = m1 To m2
    a(49) = a1(j49)

    a(33) = Pr9 - a(49)

    b(1) = a(9): b(2) = a(17): b(3) = a(25): b(4) = a(33): b(5) = a(41): b(6) = a(49): b(7) = a(57): b(8) = a(65): b(9) = a(73):
    n81 = 9: GoSub 1860: If fl1 = 0 Then GoTo 330

    a(50) = s1 - a(46) - a(47) - a(48) - a(49) - a(51) - a(52) - a(53) - a(54)
    a(32) = Pr9 - a(50)

    a(40) = s1 - a(4) - a(13) - a(22) - a(31) - a(49) - a(58) - a(67) - a(76)
    a(42) = Pr9 - a(40)

GoSub 1800: If fl1 = 0 Then GoTo 420  'Back Check
GoSub 1500: If fl1 = 0 Then GoTo 420  'Check Self Orthogonal


n9 = n9 + 1: GoSub 2645: ''End
''Cells(1, 1).Value = n9
Cells(1, 84).Value = a(80)


420 a(42) = 0
400 a(40) = 0
320 a(32) = 0
500 a(50) = 0
330 a(33) = 0
490 a(49) = 0
    Next j49

480 a(48) = 0
340 a(34) = 0

390 a(39) = 0
430 a(43) = 0
    Next j43
    
300 a(30) = 0
520 a(52) = 0
    Next j52

250 a(25) = 0
570 a(57) = 0
240 a(24) = 0
580 a(58) = 0
    Next j58

230 a(23) = 0
590 a(59) = 0
    Next j59

220 a(22) = 0
600 a(60) = 0
    Next j60

'  ******************************

560 a(56) = 0
260 a(26) = 0

470 a(47) = 0
350 a(35) = 0
    Next j35

380 a(38) = 0
440 a(44) = 0
    Next j44

290 a(29) = 0
530 a(53) = 0
    Next j53

200 a(20) = 0
620 a(62) = 0
    Next j62

170 a(17) = 0
650 a(65) = 0
160 a(16) = 0
660 a(66) = 0
    Next j66
    
150 a(15) = 0
670 a(67) = 0
    Next j67
    
140 a(14) = 0
680 a(68) = 0
    Next j68
    
130 a(13) = 0
690 a(69) = 0
    Next j69
    
120 a(12) = 0
700 a(70) = 0
    Next j70

'  ******************************

640 a(64) = 0
180 a(18) = 0
550 a(55) = 0
270 a(27) = 0
    Next j27
    
460 a(46) = 0
360 a(36) = 0
    Next j36
    
370 a(37) = 0
450 a(45) = 0
    Next j45

280 a(28) = 0
540 a(54) = 0
    Next j54
    
190 a(19) = 0
630 a(63) = 0
    Next j63
    
100 a(10) = 0
720 a(72) = 0
    Next j72

90  a(9) = 0
730 a(73) = 0
80  a(8) = 0
740 a(74) = 0
    Next j74
    
70  a(7) = 0
750 a(75) = 0
    Next j75
    
60  a(6) = 0
760 a(76) = 0
    Next j76

50  a(5) = 0
770 a(77) = 0
    Next j77
    
40  a(4) = 0
780 a(78) = 0
    Next j78

30  a(3) = 0
790 a(79) = 0
    Next j79

20  a(2) = 0
800 a(80) = 0
    Next j80

    t2 = Timer
    
    t10 = Str(t2 - t1) + " sec., " + Str(n9) + " Solutions for sum" + Str(s1)
    y = MsgBox(t10, 0, "Routine SelfOrth9a")

End
    
'    Initialise diiagonal a()
    
1700 Erase a
     i2 = -1
     For i1 = 1 To 81 Step 10:
         i2 = i2 + 1
         a(i1) = i2
     Next i1
    
     Return
     
'   Exclude solutions with identical numbers in rows, columns, diagonals, sub squares (9)

1800 fl1 = 1
    
'   Rows
    
    i1 = -8
    For i0 = 1 To 9
        i1 = i1 + 9
        b(1) = a(i1): b(2) = a(i1 + 1): b(3) = a(i1 + 2): b(4) = a(i1 + 3): b(5) = a(i1 + 4)
        b(6) = a(i1 + 5): b(7) = a(i1 + 6): b(8) = a(i1 + 7): b(9) = a(i1 + 8)
        n81 = 9: GoSub 1860: If fl1 = 0 Then Return
    Next i0
   
'   Columns
    
    i1 = 0
    For i0 = 1 To 9
        i1 = i1 + 1
        b(1) = a(i1): b(2) = a(i1 + 9): b(3) = a(i1 + 18): b(4) = a(i1 + 27): b(5) = a(i1 + 36)
        b(6) = a(i1 + 45): b(7) = a(i1 + 54): b(8) = a(i1 + 63): b(9) = a(i1 + 72)
        n81 = 9: GoSub 1860: If fl1 = 0 Then Return
    Next i0
    
'   Main Diagonals

    b(1) = a(1): b(2) = a(11): b(3) = a(21): b(4) = a(31): b(5) = a(41): b(6) = a(51): b(7) = a(61): b(8) = a(71): b(9) = a(81):
    n81 = 9: GoSub 1860: If fl1 = 0 Then Return
    b(1) = a(9): b(2) = a(17): b(3) = a(25): b(4) = a(33): b(5) = a(41): b(6) = a(49): b(7) = a(57): b(8) = a(65): b(9) = a(73):
    n81 = 9: GoSub 1860: If fl1 = 0 Then Return
    
    Return
    
1860 fl1 = 1
     For j1 = 1 To n81
        b20 = b(j1)
        For j2 = (1 + j1) To n81
            If b20 = b(j2) Then fl1 = 0: Return
        Next j2
     Next j1
     Return

'   Print results (selected numbers)

2645 For i1 = 1 To 81
         Cells(n9, i1).Value = a(i1)
     Next i1
     Cells(n9, 82).Value = n9
     Cells(1, 83).Value = n9
     Return

'    Print results (squares)

2650 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 = CStr(n9)
    
     i3 = 0
     For i1 = 1 To 9
         For i2 = 1 To 9
             i3 = i3 + 1
             Cells(k1 + i1, k2 + i2).Value = a(i3)
         Next i2
     Next i1
    
     Return
    
1500 fl1 = 1

'    Transpose a()

     i3 = 0: Erase a0
     For i1 = 1 To 9
     For i2 = 1 To 9
         i3 = i3 + 1
         a0(i1, i2) = a(i3)
     Next i2
     Next i1
    
     i3 = 0:
     For i1 = 1 To 9
     For i2 = 1 To 9
         i3 = i3 + 1
         b2(i3) = a0(i2, i1)
     Next i2
     Next i1
    
'    Calculate c2()
    
     Erase c2
     For i1 = 1 To 81
         c2(i1) = 9 * a(i1) + b2(i1) + 1
     Next i1

     fl1 = 1: n20 = 0
     For j1 = 1 To 81
        a20 = c2(j1): If a20 = 1 Then GoTo 1510
        For j2 = (1 + j1) To 81
            If a20 = c2(j2) Then fl1 = 0: Return
        Next j2
1510 Next j1

     Return    

End Sub

Vorige Pagina About the Author