ИМК 8 методом хода шахматного коня. 6
Обстоятельная статья по цепям Александрова находится по ссылке:
http://renuar911.narod.ru/IMS_Alexandrov.html
Там приводится текст программы на языке Yabasic:
rem Построение идеального магического квадрата ИМК
dim p(1000),z(1000,1000),t(1000),r(1000)
print " INPUT THE ORDER OF IMS (n = 5, 7, 8, 9, 11, 12, ... )";
input n:print
if n<5 or (n-2)/4=int((n-2)/4) then print "For n = ";:print n;
print " decisions does not exist ":print:print:end:fi
open #1,"Ideal_n.txt","w"
rem Составление цепи Александрова
p(1)=1:p(2)=n:k=(n-4)/8
if n/2=int(n/2) then
if k=int(k) then
r1=n/2+2:p1=4*(k+1):p(r1)=2
for i=0 to k-0:p(r1+1+i)=p1-4*i:next i
p2=p1-5:r2=r1+k:p(r2)=p2
for i=0 to k-2:p(r2+i)=p2-4*i:next i
r3=r2+k-1:p(r3)=8
p(r3+1)=4:p(r3+2)=3:p(r3+3)=6
r4=r3+4:for i=0 to k-2:p(r4+i)=5+4*i:next i
r5=n:for i=0 to k-2:p(n-i)=p1-2-4*i:next i:fi
if k<>int(k) then:p(n/2+2)=2
for i=1 to n/4-1:p(n/2+2+i)=n/2-2*(i-1):next i
for j=1 to n/4-1:p(n/2+1+i+j)=3+2*(j-1):next j:fi
for i=3 to n/2+1:p(i)=n+1-p(n+3-i):next i:fi
if n/2<>int(n/2) then:n1=(n-3)/2
p(1)=1:p(2)=n:p((1+n)/2+1)=(1+n)/2:no=(n-3)/2
t(5)=3:t(7)=6:t(9)=2:if n=5 then p(3)=2:p(n)=4:fi
if n=7 then p(3)=3:p(4)=6:p(6)=2:p(n)=5:fi
if n=9 then p(3)=3:p(4)=6:p(5)=2:p(7)=8:p(8)=4:p(n)=7:fi
if n>9 then:t(11)=5:t(13)=7:t(15)=4:t(17)=8:t(19)=12
t(21)=9:s=21
for k=1 to (n+1)/2:for i=1 to 6:s=s+2:t(s)=6*k+t(9+2*i)
next i:next k
rem Блок корректировки значений t(i)
o=mod(n,12)
if o=11 then t(n-4)=t(n-4)-2:fi
if o=1 or o=7 then t(n)=t(n)-3:fi
s1=2:s0=0
for i=5 to n step 2:s1=s1+1:p(s1)=t(i):s0=s0+1:r(s0)=1+n-t(i)
next i:s1=s1+1
for i=n to 5 step -2:s1=s1+1:p(s1)=r(s0):s0=s0-1:next i:fi
s=0:s1=0:s0=0:fi:print #1
print #1,"ИДЕАЛЬНЫЙ МАГИЧЕСКИЙ КВАДРАТ ПОРЯДКА n = ";
print #1,n
print #1,"ЦЕПЬ АЛЕКСАНДРОВА : ";
for i=1 to n:print p(i);:print #1,p(i);:next i:print:print:print:print #1
print #1:for k=1 to n:for t=1 to n
if n/2<>int(n/2) then
if k=1 and t=1 then j=(n+1)/2:i=(n+1)/2-1:fi
if t=1 and k>1 then i=i+2:if j<0 then j=j+n:fi:if i<0 then i=i+n
fi:fi:if t>1 then i=i+1:j=j+2:fi:fi
if n/2=int(n/2) then
if k=1 and t=1 then j=1:i=1:fi
if t=1 and k>1 then i=i-1:j=j-1:if j<0 then j=j+n:fi:if i<0 then
i=i+n:fi:fi:if t>1 then i=i+1:j=j+2:fi:fi
rem приведение i и j к рамкам магического квадрата
v=i:a():i=v2:v=j:a():j=v2:z=(p(k)-1)*n+p(t):z1=int(z)
if abs(z-z1)>.9 then z=z1+1 else z=z1:fi:z(i,j)=z
next t:next k:print #1:for i=1 to n:for j=1 to n
print #1,z(i,j) using "####";
next j:print #1:print #1:next i:print #1
sub a()
v0=v/n:v1=int(v0):if v0<1 then v1=0:fi
v2=(v0-v1)*n:v3=int(v2)
if abs(v2-v3)>.9 then v2=v3+1 else z=v3:fi
if abs(v2)<.0000000001 then v2=n:fi
end sub
Программа составлена таким образом, что можно задаваться любым числом n (по запросу с экрана), но в тех случаях, когда ИМК невозможны, (например, при n=18) выдается сообщение:
For n = 18 decisions does not exist, то есть: Для n=18 решений не существует.
Если при запуске проги ввести с клавиатуры число 8, то будет выведено решение, показанное на рисунке. Это последовательность восьми чисел (цепь Александрова) и идеальный магический квадрат. Рассмотрим подробно, как сказанные вещи взаимно связаны.
Итак, для ИМК(8) цепь чисел A(i) : 1 8 6 5 7 2 4 3. Теория их довольно сложная. Я такую последовательность получил тупым перебором миллиардов вариантов. Насчет же единственности решения ничего не могу сказать. Возможно, существуют иные решения. Надеюсь, скоро появится продвинутый математик, который расставит все точки над i.
Алгоритм получения цепей Александрова виден в тексте программы. Если кому интересно, может пройтись по командам и всё уяснить. Моя же задача сейчас - показать принцип построения идеального магического квадрата. Для удобства излагаю по пунктам.
1. Единичку помещаем в левой верхней ячейке.
2. Делаем ходы шахматным конём так: два шага наверх, шаг вправо. Ячейки выделяем красными рамками. В этих ячейках находятся числа z(i), определяемые формулой:
z(i)=[A(i)-1]*n+1.
Найдем эти числа:
z(1)=[1-1]*8+1=1
z(2)=[8-1]*8+1=57
z(3)=[6-1]*8+1=41
z(4)=[5-1]*8+1=33
z(5)=[7-1]*8+1=49
z(6)=[2-1]*8+1=9
z(7)=[4-1]*8+1=25
z(8)=[3-1]*8+1=17
Расстановка полученных восьми результатов по выделенным ячейкам производится весьма хитрым путем. На рисунке в правой верхней части приведена схема преобразования цепи в последовательность чисел, помещаемых в красные рамки. Не буду грузить читателя высокими математическими материями, а скажу только, что это результат месячной работы головного мозга. Шахматные ходы по зеленым кружочкам в матрице восьмого порядка сомнений, думаю, не вызывают.
27 июля 2021 г.
Свидетельство о публикации №221072601756