На данном сайте используется язык QBasic. Профессиональный XP позволяет запускать все программы без ограничений.В домашних версиях XP и Vista для запуска программ с графикой Бейсик надо загружать через эмулятор(например dosbox -простым перетаскиванием).В 64-битной 7-е Бейсик можно запустить только через эмулятор.Чтобы сделать скриншот экрана,Бейсик нужно запускать через эмулятор даже в профессиональном XP.
На главной странице размещаются следующие программы: 1 Программа получающая группы симметрии позиций ферзей не атакующих друг друга на обычной шахматной доске(8*8). 2.Нахождение позиций ферзей не атакующих друг друга на доске произвольной размерности n*n и аналогичная программа для магарадж. 3 Нахождение позиций слонов не атакующих друг друга на обычной шахматной доске. 4 Игра "Расставь ферзей".(графика) 5 Визуализация позиций ферзей не атакующих друг друга на обычной доске.(графика) 6 Заполнение доски 7*7 позициями ферзей не атакующих друг друга. 7 Cвязь групп позиций заполнения с магическими квадратами. Для задачи о позициях 8-и ферзей, не атакующих друг друга на доске 8*8, в сети приводится множество решений на различных языках программирования. Приводятся также 12 базовых позиций, из которых можно получить все позиции путём симметричных преобразований квадрата, однако нет программ, получающих сами группы симметрии. Здесь приводится программа, позволяющая получить эти группы,формируя набор базовых позиций с наименьшими номерами в группе.Фрагмент программы с вложеными циклами генерирует все 92 позиции независимых ферзей,с которыми далее последовательно производятся преобразования симметрии,исключая позиции уже вошедшие в группы симметрии.Список позиций,получаемый генератором (см.Википедия - 8 ферзей) устроен так,что позиции симметричные относительно горизонтальной оси расположены симметрично относительно горизонтальной оси списка.
CLS DEFINT A-I OPEN "grupfer8" FOR OUTPUT AS #1 DIM a(92), b(92), c(92), d(92), e(92), f(92), g(92), h(92) DIM a1(96), b1(96), c1(96), d1(96), e1(96), f1(96), g1(96), h1(96)
FOR a = 1 TO 8 FOR b = 1 TO 8 IF b = a THEN 8 IF ABS(b - a) = 1 THEN 8 FOR c = 1 TO 8 IF c = a OR c = b THEN 7 IF ABS(c - b) = 1 OR ABS(c - a) = 2 THEN 7 FOR d = 1 TO 8 IF d = a OR d = b OR d = c THEN 6 IF ABS(d - c) = 1 OR ABS(d - b) = 2 OR ABS(d - a) = 3 THEN 6 FOR e = 1 TO 8 IF e = a OR e = b OR e = c OR e = d THEN 5 IF ABS(e - d) = 1 OR ABS(e - c) = 2 OR ABS(e - b) = 3 OR ABS(e - a) = 4 THEN 5 FOR f = 1 TO 8 IF f = a OR f = b OR f = c OR f = d OR f = e THEN 4 IF ABS(f - e) = 1 OR ABS(f - d) = 2 OR ABS(f - c) = 3 OR ABS(f - b) = 4 OR ABS(f - a) = 5 THEN 4 FOR g = 1 TO 8 IF g = a OR g = b OR g = c OR g = d OR g = e OR g = f THEN 3 IF ABS(g - f) = 1 OR ABS(g - e) = 2 OR ABS(g - d) = 3 OR ABS(g - c) = 4 OR ABS(g - b) = 5 OR ABS(g - a) = 6 THEN 3 FOR h = 1 TO 8 IF h = a OR h = b OR h = c OR h = d OR h = e OR h = f OR h = g THEN 2 IF ABS(h - g) = 1 OR ABS(h - f) = 2 OR ABS(h - e) = 3 OR ABS(h - d) = 4 OR ABS(h - c) = 5 OR ABS(h - b) = 6 OR ABS(h - a) = 7 THEN 2 p = p + 1 a(p) = a: b(p) = b: c(p) = c: d(p) = d: e(p) = e: f(p) = f: g(p) = g: h(p)= h 2 NEXT h 3 NEXT g 4 NEXT f 5 NEXT e 6 NEXT d 7 NEXT c 8 NEXT b NEXT a 60 r = r + 1 'номер первой позиции в группе IF r = 90 THEN END IF l = 0 THEN 'избежание повторных пробелов между группами PRINT " " PRINT #1, " " END IF FOR k = 1 TO 8 x(k) = k NEXT y(1) = a(r): y(2) = b(r): y(3) = c(r): y(4) = d(r): y(5) = e(r): y(6) = f(r): y(7) = g(r): y(8) = h(r)
FOR n = 1 TO m 'избежание повторного получения групп IF y(1) = a1(n) AND y(2) = b1(n) AND y(3) = c1(n) AND y(4) = d1(n) AND y(5) = e1(n) AND y(6) = f1(n) AND y(7) = g1(n) AND y(8) = h1(n) THEN l = l + 1: GOTO 60 NEXT l = 0 rs = rs + 1 'номер группы PRINT " "; rs PRINT #1, " "; rs 'производим преобразование координат 'для каждого типа симметрии 'исходное положение FOR i = 1 TO 8 z(i) = x(i) u(i) = y(i) NEXT GOSUB 1 'отражение от вертикальной оси PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = 9 - x(i) u(i) = y( i) NEXT GOSUB 1 'отражение от горизонтальной оси PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = x(i) u(i) = 9 - y(i) NEXT GOSUB 1 'отражение от диагонали / PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = y(i) u(i) = x(i) NEXT GOSUB 1 'отражение от диагонали \ PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = 9 - y(i) u(i) = 9 - x(i) NEXT GOSUB 1 'поворот на 90 гр. PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = y(i) u(i) = 9 - x(i) NEXT GOSUB 1 'поворот на 180 гр. PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = 9 - x(i) u(i) = 9 - y(i) NEXT GOSUB 1 'поворот на 270 гр. PRINT " " PRINT #1, " " FOR i = 1 TO 8 z(i) = 9 - y(i) u(i) = x(i) NEXT GOSUB 1 GOTO 60 END
' ------------------------------------------------------ 1 FOR i = 1 TO 8 IF z(i) = 1 THEN o$(i) = "a" IF z(i) = 2 THEN o$(i) = "b" IF z(i) = 3 THEN o$(i) = "c" IF z(i) = 4 THEN o$(i) = "d" IF z(i) = 5 THEN o$(i) = "e" IF z(i) = 6 THEN o$(i) = "f" IF z(i) = 7 THEN o$(i) = "g" IF z(i) = 8 THEN o$(i) = "h" NEXT
PRINT " "; PRINT #1, " "; 'упорядочивание нового расположения по возрастанию FOR i = 1 TO 8 IF o$(i) = "a" THEN PRINT o$(i); u(i); " "; : PRINT #1, o$(i); u(i); " "; : GOTO 21 END IF NEXT 21 a1 = u(i) FOR i = 1 TO 8 IF o$(i) = "b" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 22 END IF NEXT 22 b1 = u(i) FOR i = 1 TO 8 IF o$(i) = "c" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 23 END IF NEXT 23 c1 = u(i) FOR i = 1 TO 8 IF o$(i) = "d" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 24 END IF NEXT 24 d1 = u(i) FOR i = 1 TO 8 IF o$(i) = "e" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 25 END IF NEXT 25 e1 = u(i) FOR i = 1 TO 8 IF o$(i) = "f" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 26 END IF NEXT 26 f1 = u(i) FOR i = 1 TO 8 IF o$(i) = "g" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 27 END IF NEXT 27 g1 = u(i) FOR i = 1 TO 8 IF o$(i) = "h" THEN PRINT o$(i); u(i); " "; PRINT #1, o$(i); u(i); " "; : GOTO 28 END IF NEXT 28 h1 = u(i) m = m + 1 'формирование массива позиций уже вошедших в группы симметрии и расчёт их номеров. a1(m) = a1: b1(m) = b1: c1(m) = c1: d1(m) = d1: e1(m) = e1: f1(m) = f1: g1(m) = g1: h1(m) = h1 FOR k = 1 TO 92 IF a1(m) = a(k) AND b1(m) = b(k) AND c1(m) = c(k) AND d1(m) = d(k) AND e1(m) = e(k) AND f1(m) = f(k) AND g1(m) = g(k) AND h1(m) = h(k) THEN PRINT ":"; k PRINT #1, ":"; k END IF NEXT RETURN
В результате получается следующая таблица:
1 a 1 b 5 c 8 d 6 e 3 f 7 g 2 h 4 : 1 a 4 b 2 c 7 d 3 e 6 f 8 g 5 h 1 : 33 a 8 b 4 c 1 d 3 e 6 f 2 g 7 h 5 : 92 a 1 b 7 c 5 d 8 e 2 f 4 g 6 h 3 : 4 a 6 b 3 c 5 d 7 e 1 f 4 g 2 h 8 : 71 a 8 b 2 c 4 d 1 e 7 f 5 g 3 h 6 : 89 a 5 b 7 c 2 d 6 e 3 f 1 g 4 h 8 : 60 a 3 b 6 c 4 d 2 e 8 f 5 g 7 h 1 : 22 2 a 1 b 6 c 8 d 3 e 7 f 4 g 2 h 5 : 2 a 5 b 2 c 4 d 7 e 3 f 8 g 6 h 1 : 51 a 8 b 3 c 1 d 6 e 2 f 5 g 7 h 4 : 91 a 1 b 7 c 4 d 6 e 8 f 2 g 5 h 3 : 3 a 6 b 4 c 7 d 1 e 3 f 5 g 2 h 8 : 78 a 8 b 2 c 5 d 3 e 1 f 7 g 4 h 6 : 90 a 4 b 7 c 5 d 2 e 6 f 1 g 3 h 8 : 42 a 3 b 5 c 2 d 8 e 6 f 4 g 7 h 1 : 15 3 a 2 b 4 c 6 d 8 e 3 f 1 g 7 h 5 : 5 a 5 b 7 c 1 d 3 e 8 f 6 g 4 h 2 : 57 a 7 b 5 c 3 d 1 e 6 f 8 g 2 h 4 : 88 a 6 b 1 c 5 d 2 e 8 f 3 g 7 h 4 : 65 a 5 b 2 c 6 d 1 e 7 f 4 g 8 h 3 : 52 a 3 b 8 c 4 d 7 e 1 f 6 g 2 h 5 : 28 a 4 b 2 c 8 d 6 e 1 f 3 g 5 h 7 : 36 a 4 b 7 c 3 d 8 e 2 f 5 g 1 h 6 : 41 4 a 2 b 5 c 7 d 1 e 3 f 8 g 6 h 4 : 6 a 4 b 6 c 8 d 3 e 1 f 7 g 5 h 2 : 39 a 7 b 4 c 2 d 8 e 6 f 1 g 3 h 5 : 87 a 4 b 1 c 5 d 8 e 2 f 7 g 3 h 6 : 29 a 3 b 6 c 2 d 7 e 1 f 4 g 8 h 5 : 19 a 5 b 8 c 4 d 1 e 7 f 2 g 6 h 3 : 64 a 5 b 3 c 1 d 6 e 8 f 2 g 4 h 7 : 54 a 6 b 3 c 7 d 2 e 8 f 5 g 1 h 4 : 74 5 a 2 b 5 c 7 d 4 e 1 f 8 g 6 h 3 : 7 a 3 b 6 c 8 d 1 e 4 f 7 g 5 h 2 : 23 a 7 b 4 c 2 d 5 e 8 f 1 g 3 h 6 : 86 a 5 b 1 c 8 d 4 e 2 f 7 g 3 h 6 : 48 a 3 b 6 c 2 d 7 e 5 f 1 g 8 h 4 : 20 a 4 b 8 c 1 d 5 e 7 f 2 g 6 h 3 : 45 a 6 b 3 c 1 d 8 e 5 f 2 g 4 h 7 : 70 a 6 b 3 c 7 d 2 e 4 f 8 g 1 h 5 : 73 6 a 2 b 6 c 1 d 7 e 4 f 8 g 3 h 5 : 8 a 5 b 3 c 8 d 4 e 7 f 1 g 6 h 2 : 56 a 7 b 3 c 8 d 2 e 5 f 1 g 6 h 4 : 85 a 3 b 1 c 7 d 5 e 8 f 2 g 4 h 6 : 13 a 3 b 5 c 7 d 1 e 4 f 2 g 8 h 6 : 16 a 6 b 8 c 2 d 4 e 1 f 7 g 5 h 3 : 80 a 4 b 6 c 1 d 5 e 2 f 8 g 3 h 7 : 37 a 6 b 4 c 2 d 8 e 5 f 7 g 1 h 3 : 77 7 a 2 b 6 c 8 d 3 e 1 f 4 g 7 h 5 : 9 a 5 b 7 c 4 d 1 e 3 f 8 g 6 h 2 : 62 a 7 b 3 c 1 d 6 e 8 f 5 g 2 h 4 : 84 a 5 b 1 c 4 d 6 e 8 f 2 g 7 h 3 : 47 a 6 b 2 c 7 d 1 e 3 f 5 g 8 h 4 : 66 a 4 b 8 c 5 d 3 e 1 f 7 g 2 h 6 : 46 a 4 b 2 c 5 d 8 e 6 f 1 g 3 h 7 : 31 a 3 b 7 c 2 d 8 e 6 f 4 g 1 h 5 : 27 8 a 2 b 7 c 3 d 6 e 8 f 5 g 1 h 4 : 10 a 4 b 1 c 5 d 8 e 6 f 3 g 7 h 2 : 30 a 7 b 2 c 6 d 3 e 1 f 4 g 8 h 5 : 83 a 7 b 1 c 3 d 8 e 6 f 4 g 2 h 5 : 81 a 4 b 7 c 5 d 3 e 1 f 6 g 8 h 2 : 43 a 2 b 8 c 6 d 1 e 3 f 5 g 7 h 4 : 12 a 5 b 8 c 4 d 1 e 3 f 6 g 2 h 7 : 63 a 5 b 2 c 4 d 6 e 8 f 3 g 1 h 7 : 50 9 a 2 b 7 c 5 d 8 e 1 f 4 g 6 h 3 : 11 a 3 b 6 c 4 d 1 e 8 f 5 g 7 h 2 : 21 a 7 b 2 c 4 d 1 e 8 f 5 g 3 h 6 : 82 a 5 b 1 c 8 d 6 e 3 f 7 g 2 h 4 : 49 a 5 b 7 c 2 d 6 e 3 f 1 g 8 h 4 : 61 a 4 b 8 c 1 d 3 e 6 f 2 g 7 h 5 : 44 a 6 b 3 c 5 d 8 e 1 f 4 g 2 h 7 : 72 a 4 b 2 c 7 d 3 e 6 f 8 g 1 h 5 : 32 10 a 3 b 5 c 2 d 8 e 1 f 7 g 4 h 6 : 14 a 6 b 4 c 7 d 1 e 8 f 2 g 5 h 3 : 79 a 6 b 4 c 7 d 1 e 8 f 2 g 5 h 3 : 79 a 5 b 3 c 1 d 7 e 2 f 8 g 6 h 4 : 55 a 5 b 3 c 1 d 7 e 2 f 8 g 6 h 4 : 55 a 4 b 6 c 8 d 2 e 7 f 1 g 3 h 5 : 38 a 3 b 5 c 2 d 8 e 1 f 7 g 4 h 6 : 14 a 4 b 6 c 8 d 2 e 7 f 1 g 3 h 5 : 38 11 a 3 b 5 c 8 d 4 e 1 f 7 g 2 h 6 : 17 a 6 b 2 c 7 d 1 e 4 f 8 g 5 h 3 : 67 a 6 b 4 c 1 d 5 e 8 f 2 g 7 h 3 : 76 a 5 b 7 c 1 d 4 e 2 f 8 g 6 h 3 : 58 a 6 b 3 c 1 d 7 e 5 f 8 g 2 h 4 : 68 a 4 b 2 c 8 d 5 e 7 f 1 g 3 h 6 : 35 a 3 b 7 c 2 d 8 e 5 f 1 g 4 h 6 : 26 a 3 b 6 c 8 d 2 e 4 f 1 g 7 h 5 : 25 12 a 3 b 6 c 2 d 5 e 8 f 1 g 7 h 4 : 18 a 4 b 7 c 1 d 8 e 5 f 2 g 6 h 3 : 40 a 6 b 3 c 7 d 4 e 1 f 8 g 2 h 5 : 75 a 6 b 3 c 1 d 8 e 4 f 2 g 7 h 5 : 69 a 4 b 2 c 7 d 5 e 1 f 8 g 6 h 3 : 34 a 3 b 6 c 8 d 1 e 5 f 7 g 2 h 4 : 24 a 5 b 2 c 8 d 1 e 4 f 7 g 3 h 6 : 53 a 5 b 7 c 2 d 4 e 8 f 1 g 3 h 6 : 59
Сумма номеров позиций связанных симметрией отражения от горизонтальной оси равна 93. Значит сумма номеров в группе 93*4=372. Группа 10 симметрическая - позиции переходят сами в себя при повороте на 180 градусов. Понятно, что базовых групп можно составить 8^11*4. По виду симметрии позиций по отношению к базовой позиции можно определить вид симметрии позиций по отношению друг к другу.
Пусть позиция 1 получается из базовой посредством отражения от горизонталь- ной оси : x1 = x y1 = 9 - y Позиция 2 - посредством отражения от вертикальной оси: x2 = 9 - x y2 = y Выражаем x и y из первой системы уравнений и подставляем во вторую x2 = 9 - x1 y2 = 9 - y1 Эти уравнения выражают поворот на 180 градусов. Немного о досках других размерностей. Данные преобразования координат выполняются и для досок других размерностей,только 9 заменяется на n+1. Понятно,что в условиях данной задачи,позиция не может переходить сама в себя при отражении. Но возможен такой переход не только при повороте на 180 градусов,но и при повороте на 90 и 270 градусов(эти повороты взаимно обратимы). Такие группы симметрии называются дважды симметрическими. Они существуют для досок размерностью 4 и 5 . Для доски 4*4 имеют место 2 позиции не атакующих друг друга ферзей,которые образуют дважды симметрическую группу. 1 a 2 b 4 c 1 d 3 a 3 b 1 c 4 d 2 a 3 b 1 c 4 d 2 a 3 b 1 c 4 d 2 a 3 b 1 c 4 d 2 a 2 b 4 c 1 d 3 a 2 b 4 c 1 d 3 a 2 b 4 c 1 d 3
Для доски 5*5 10 позиций образуют одну обычную и одну дважды симметрическую группы.
1 a 1 b 3 c 5 d 2 e 4 a 4 b 2 c 5 d 3 e 1 a 5 b 3 c 1 d 4 e 2 a 1 b 4 c 2 d 5 e 3 a 3 b 1 c 4 d 2 e 5 a 5 b 2 c 4 d 1 e 3 a 2 b 4 c 1 d 3 e 5 a 3 b 5 c 2 d 4 e 1
2 a 4 b 1 c 3 d 5 e 2 a 2 b 5 c 3 d 1 e 4 a 2 b 5 c 3 d 1 e 4 a 2 b 5 c 3 d 1 e 4 a 2 b 5 c 3 d 1 e 4 a 4 b 1 c 3 d 5 e 2 a 4 b 1 c 3 d 5 e 2 a 4 b 1 c 3 d 5 e 2 Дважды симметрические группы существуют также для больших досок,начиная с доски 12*12,но не для всех. *************************************************************** Для получения позиций n ферзей не бьющих друг друга на доске n*n, в случае любого n, предлагается программа основанная на том же алгоритме (перебор с возвратом), что и программа с вложенными циклами.Достоинство первой программы в её прозрачности.Поняв её, можно понять и эту. CLS DEFINT A-Z INPUT "Название файла для результатов";FILENAME$ OPEN FILENAME$ FOR OUTPUT AS 1 INPUT " n= "; n DIM y(n + 1) 1 k = k + 1 IF k = n + 1 THEN 2 8 y(k) = y(k) + 1 IF y(1) = n + 1 THEN END IF y(k) = n + 1 THEN y(k) = 0: k = k - 1: GOTO 8 END IF FOR j = 1 TO k - 1 IF y(j) = y(k) OR ABS(y(k) - y(j)) = k - j THEN 8 NEXT GOTO 1 2 i# = i# + 1 PRINT i#; ":"; FOR j = 1 TO n PRINT y(j); NEXT PRINT " " PRINT #1, i#; ":"; FOR j = 1 TO n PRINT #1, y(j); NEXT PRINT #1, " " k=k-1 GOTO 8
Реально по времени можно дойти до доски 15*15 включительно, при условии создания exe файла в QuickBasice 4.5 или других версиях с компилятором.Терпеливые могут попробывать и доску 16*16,но запись позиций займёт сотни мегабайт.Если не записывать в файл и не выводить на экран,а просто считать,то конечно будет гораздо быстрее.Впрочем всё это посчитано до нас вплоть до доски 26*26 включительно.(Кластер из 300 машин работал в течении полгода.)См.украинскую версию статьи в Википедиию. Мы же можем быстро найти,что на доске 12*12 будет 14200 позиций-последняя :12,10,8,5,3,1,7,2,11,6,4,9 На доске 13*13 будет 73712 позиций-последняя: 13,11,9,12,5,2,4,1,10,8,6,3,7 Конечно,программы на QBasic-е легко переводятся в код для VB 6.Вот как выглядит код данной программы.(Можно отметить,что в VB 6 нет операторов DEFINT и SLEEP,вместо INPUT используется InputBox. Cls Dim k,j,n As Integer n = InputBox("размерность доски") Print " Пожалуйста,подождите." 1 k = k + 1 10 Cls v$ = InputBox("нажмите любую клавишу + Enter и смотрите файл")
В нетрадиционных шахматах существует фигура называемая “магараджа”,которая совмещает свойства ферзя и коня.Можно дополнить программу,чтобы находить и позиции магарадж,не атакующих друг друга.Их, конечно, будет гораздо меньше,чем позиций ферзей.Они не существуют для досок меньших 10*10. CLS DEFINT A-Z INPUT " имя файла для результатов"; filename$ OPEN filename$ FOR OUTPUT AS 1 INPUT " n= "; n DIM y(n + 2) 1 k = k + 1 IF k = n + 1 THEN 2 8 y(k) = y(k) + 1 IF y(1) = n + 1 THEN END IF y(k) = n + 1 THEN y(k) = 0: k = k - 1: GOTO 8 END IF FOR j = 1 TO k - 1 IF y(j) = y(k) OR ABS(y(k) - y(j)) = k - j THEN 8 NEXT GOTO 1 2 r = 0 3 r = r + 1 IF r = n - 2 THEN 4 IF ABS(y(r + 1) - y(r)) = 2 THEN 8 IF ABS(y(r + 2) - y(r)) = 1 THEN 8 GOTO 3 4 IF ABS(y(r + 1) - y(r)) = 2 THEN 8 IF ABS(y(r) - y(r - 1)) = 2 THEN 8 IF ABS(y(r) - y(r - 2)) = 1 THEN 8 IF ABS(y(r + 1) - y(r - 1)) = 1 THEN 8 IF ABS(y(r + 2) - y(r)) = 1 THEN 8 IF ABS(y(r + 2) - y(r + 1)) = 2 THEN 8 i = i + 1 PRINT i; ":"; FOR j = 1 TO n PRINT y(j); NEXT PRINT " " PRINT #1, i; ":"; FOR j = 1 TO n PRINT #1, y(j); NEXT PRINT #1, " " GOTO 8 Вот позиции магарадж для доски 10*10. Их всего 4,образующие симметрическую группу. 1 : 3 6 9 1 4 7 10 2 5 8 2 : 4 8 1 5 9 2 6 10 3 7 3 : 7 3 10 6 2 9 5 1 8 4 4 : 8 5 2 10 7 4 1 9 6 3
Близка задаче о независимости ферзей задача о независимости слонов.Очевидно, при взгляде на обычную доску,что на ней можно расположить по 7 слонов каждого цвета,которые не угрожают друг другу.Значит всего 14.Для произвольной доски 2n-2,где n – размерность доски.Понятно,что позиции белопольных и чернопольных слонов рассчитываются отдельно.Ниже представлена программа,которая рассчитывает позиции чёрнопольных слонов на обычной доске.Для белопольных слонов нужно в операторе DATA номера чёрных клеток заменить на номера белых. Принцип нумерации,я думаю,очевиден- снизу вверх в каждом столбце.
CLS OPEN "nezslonb" FOR OUTPUT AS #1 DIM y(7) AS INTEGER DIM n(32), c(32) AS INTEGER DATA 1,3,5,7,10,12,14,16,17,19,21,23,26,28,30,32,33,35,37,39,42,44,46,48,49,51,53,55,58,60,62,64 FOR n = 1 TO 32 READ c(n) NEXT FOR z1% = 1 TO 26 n1% = c(z1%) y(1) = n1% MOD 8 IF y(1) = 0 THEN y(1) = 8 FOR z2% = z1% + 1 TO 27 n2% = c(z2%) y(2) = n2% MOD 8 IF y(2) = 0 THEN y(2) = 8 FOR z3% = z2% + 1 TO 28 n3% = c(z3%) y(3) = n3% MOD 8 IF y(3) = 0 THEN y(3) = 8 FOR z4% = z3% + 1 TO 29 n4% = c(z4%) y(4) = n4% MOD 8 IF y(4) = 0 THEN y(4) = 8 FOR z5% = z4% + 1 TO 30 n5% = c(z5%) y(5) = n5% MOD 8 IF y(5) = 0 THEN y(5) = 8 FOR z6% = z5% + 1 TO 31 n6% = c(z6%) y(6) = n6% MOD 8 IF y(6) = 0 THEN y(6) = 8 FOR z7% = z6% + 1 TO 32 n7% = c(z7%) y(7) = n7% MOD 8 IF y(7) = 0 THEN y(7) = 8 GOTO 7 6 NEXT z7% 5 NEXT z6% 4 NEXT z5% 3 NEXT z4% 2 NEXT z3% 1 NEXT z2% NEXT z1%
END
7 x(1) = (n1% - y(1)) / 8 + 1 x(2) = (n2% - y(2)) / 8 + 1 x(3) = (n3% - y(3)) / 8 + 1 x(4) = (n4% - y(4)) / 8 + 1 x(5) = (n5% - y(5)) / 8 + 1 x(6) = (n6% - y(6)) / 8 + 1 x(7) = (n7% - y(7)) / 8 + 1
FOR i = 1 TO 7 FOR j = 1 TO 7 IF ABS(y(i) - y(j)) = ABS(x(i) - x(j)) AND i < j THEN 6 NEXT j NEXT i
FOR k = 1 TO 7 IF x(k) = 1 THEN x$(k) = "a" IF x(k) = 2 THEN x$(k) = "b" IF x(k) = 3 THEN x$(k) = "c" IF x(k) = 4 THEN x$(k) = "d" IF x(k) = 5 THEN x$(k) = "e" IF x(k) = 6 THEN x$(k) = "f" IF x(k) = 7 THEN x$(k) = "g" IF x(k) = 8 THEN x$(k) = "h" NEXT p = p + 1 PRINT p; ": "; x$(1); y(1); " "; x$(2); y(2); " "; x$(3); y(3); " "; x$(4); y(4); " "; x$(5); y(5); " "; x$(6); y(6); " "; x$(7); y(7) PRINT #1, p; ": "; x$(1); y(1); " "; x$(2); y(2); " "; x$(3); y(3); " "; x$(4); y(4); " "; x$(5); y(5); " "; x$(6); y(6); " "; x$(7); y(7) GOTO 6
Вот результат работы программы
1 : a 1 a 3 a 5 a 7 h 2 h 4 h 6 2 : a 1 a 3 a 5 b 8 g 1 h 4 h 6 3 : a 1 a 3 a 7 d 8 e 1 h 2 h 6 4 : a 1 a 3 b 8 d 8 e 1 g 1 h 6 5 : a 1 a 5 a 7 c 1 f 8 h 2 h 4 6 : a 1 a 5 b 8 c 1 f 8 g 1 h 4 7 : a 1 a 7 c 1 d 8 e 1 f 8 h 2 8 : a 1 b 8 c 1 d 8 e 1 f 8 g 1 9 : a 3 a 5 a 7 h 2 h 4 h 6 h 8 10 : a 3 a 5 b 8 g 1 h 4 h 6 h 8 11 : a 3 a 7 d 8 e 1 h 2 h 6 h 8 12 : a 3 b 8 d 8 e 1 g 1 h 6 h 8 13 : a 5 a 7 c 1 f 8 h 2 h 4 h 8 14 : a 5 b 8 c 1 f 8 g 1 h 4 h 8 15 : a 7 c 1 d 8 e 1 f 8 h 2 h 8 16 : b 8 c 1 d 8 e 1 f 8 g 1 h 8
Для белых клеток получаем
1 : a 2 a 4 a 6 a 8 h 3 h 5 h 7 2 : a 2 a 4 a 6 h 1 h 3 h 5 h 7 3 : a 2 a 4 a 8 c 8 f 1 h 5 h 7 4 : a 2 a 4 c 8 f 1 h 1 h 5 h 7 5 : a 2 a 6 a 8 d 1 e 8 h 3 h 7 6 : a 2 a 6 d 1 e 8 h 1 h 3 h 7 7 : a 2 a 8 c 8 d 1 e 8 f 1 h 7 8 : a 2 c 8 d 1 e 8 f 1 h 1 h 7 9 : a 4 a 6 a 8 b 1 g 8 h 3 h 5 10 : a 4 a 6 b 1 g 8 h 1 h 3 h 5 11 : a 4 a 8 b 1 c 8 f 1 g 8 h 5 12 : a 4 b 1 c 8 f 1 g 8 h 1 h 5 13 : a 6 a 8 b 1 d 1 e 8 g 8 h 3 14 : a 6 b 1 d 1 e 8 g 8 h 1 h 3 15 : a 8 b 1 c 8 d 1 e 8 f 1 g 8 16 : b 1 c 8 d 1 e 8 f 1 g 8 h 1
Каждую позицию чёрнопольных слонов можно соеденить с любой позицией белопольных,следовательно,всего получается 16*16=256 позиций.
----------------------------- Ещё одна программа на эту тему – игра “Расставь ферзей.” Она предлагается на многих сайтах в он-лайн режиме. В отличие от флеш-варинтов, где ферзи ставятся “мышкой”, здесь нужно набирать последовательно номер позиции ферзя в каждом столбце. Если зашли в тупик, набирайте 0. Если ввод ошибочен, раздаётся бип. DECLARE SUB doska () SCREEN 12 DIM a%(1000), b%(1000) COLOR 8 LINE (20, 25)-(45, 25) LINE (20, 10)-(20, 25) LINE (45, 10)-(45, 25) LINE (20, 10)-(27, 17) LINE (45, 10)-(38, 17) LINE (27, 17)-(32, 10) LINE (38, 17)-(32, 10) PAINT (30, 15), 2, 8 PAINT (21, 3), 8, 8 GET (20, 0)-(45, 30), a% CLS COLOR 8 PAINT (100, 100), 15 LINE (20, 25)-(45, 25) LINE (20, 10)-(20, 25) LINE (45, 10)-(45, 25) LINE (20, 10)-(27, 17) LINE (45, 10)-(38, 17) LINE (27, 17)-(32, 10) LINE (38, 17)-(32, 10) PAINT (30, 15), 2, 8 GET (20, 0)-(45, 30), b% FOR i = 1 TO 8 x(i) = i NEXT CALL doska 1 x = x + 1 m = m + 1 COLOR 7 2 PRINT "y"; m; "="; INPUT y IF y = 0 THEN END y(m) = y k = 1.2 FOR i = 1 TO m FOR j = 1 TO m IF (y(i)=y(j) OR ABS(x(i) - x(j)) = ABS(y(i) - y(j))) AND i <> j THEN SOUND 1000, 2 GOTO 2 END IF NEXT NEXT xg% = INT(85 + 40 * k * x) yg% = INT(450 - 40 * k * y) IF POINT(xg% - 16, yg% - 19) = 8 THEN PUT (xg% - 14, yg% - 17), a%, PSET ELSE PUT (xg% - 14, yg% - 17), b%, AND END IF IF m = 8 THEN 5 GOTO 1 5 PRINT "Ты выиграл!": SLEEP: END
SUB doska k = 1.2 LINE (0, 0)-(640, 480), 15, BF COLOR 6 'запись используемых символов LOCATE (1), (5): PRINT "A" DIM a%(100) GET (32, 0)-(38, 15), a% LOCATE (1), (5): PRINT "B" DIM b%(100) GET (32, 0)-(38, 15), b% LOCATE (1), (5): PRINT "C" DIM c%(100) GET (32, 0)-(38, 15), c% LOCATE (1), (5): PRINT "D" DIM d%(100) GET (32, 0)-(38, 15), d% LOCATE (1), (5): PRINT "E" DIM e%(100) GET (32, 0)-(38, 15), e% LOCATE (1), (5): PRINT "F" DIM f%(100) GET (32, 0)-(38, 15), f% LOCATE (1), (5): PRINT "G" DIM g%(100) GET (32, 0)-(38, 15), g% LOCATE (1), (5): PRINT "H" DIM h%(100) GET (32, 0)-(38, 15), h% LOCATE (1), (5): PRINT "1" DIM o%(100) GET (32, 0)-(38, 15), o% LOCATE (1), (5): PRINT "2" DIM dv%(100) GET (32, 0)-(38, 15), dv% LOCATE (1), (5): PRINT "3" DIM t%(100) GET (32, 0)-(38, 15), t% LOCATE (1), (5): PRINT "4" DIM ch%(100) GET (32, 0)-(38, 15), ch% LOCATE (1), (5): PRINT "5" DIM p%(100) GET (32, 0)-(38, 15), p% LOCATE (1), (5): PRINT "6" DIM sh%(100) GET (32, 0)-(38, 15), sh% LOCATE (1), (5): PRINT "7" DIM s%(100) GET (32, 0)-(38, 15), s% LOCATE (1), (5): PRINT "8" DIM v%(100) GET (32, 0)-(38, 15), v% LOCATE (1), (5): PRINT "-" DIM mn%(100) GET (32, 0)-(38, 15), mn%
CLS 'рисование шахматной доски PAINT (30, 30), 15 LINE (1, 1)-(639, 479), 15, B 'рамка COLOR 8 FOR n = -4 TO 4 LINE (300 - 160 * k, 230 + k * 40 * n)-(300 + 160 * k, 230 + k * 40 * n)'горизонтали NEXT FOR n = -4 TO 4 LINE (300 + 40 * n * k, 230 - 160 * k)-(300 + 40 * n * k, 230 + 160 * k)'вертикали NEXT FOR i = 0 TO 3 FOR j = 0 TO 3 x = 300 - 140 * k + 80 * i * k y = 230 + 140 * k - 80 * j * k PAINT (x, y), 8 NEXT NEXT FOR i = 0 TO 3 FOR j = 0 TO 3 x = 300 - 100 * k + 80 * i * k y = 230 + 100 * k - 80 * j * k PAINT (x, y), 8 NEXT NEXT PUT (300 - 140 * k, 230 + 160 * k), a% PUT (300 - 100 * k, 230 + 160 * k), b% PUT (300 - 60 * k, 230 + 160 * k), c% PUT (300 - 20 * k, 230 + 160 * k), d% PUT (300 + 20 * k, 230 + 160 * k), e% PUT (300 + 60 * k, 230 + 160 * k), f% PUT (300 + 100 * k, 230 + 160 * k), g% PUT (300 + 140 * k, 230 + 160 * k), h% PUT (300 - 170 * k, 230 + 135 * k), o% PUT (300 - 170 * k, 230 + 95 * k), dv% PUT (300 - 170 * k, 230 + 55 * k), t% PUT (300 - 170 * k, 230 + 15 * k), ch% PUT (300 - 170 * k, 230 - 25 * k), p% PUT (300 - 170 * k, 230 - 65 * k), sh% PUT (300 - 170 * k, 230 - 105 * k), s% PUT (300 - 170 * k, 230 - 145 * k), v%
END SUB Если допускать возврат ходов,то часть программы,начиная с метки 1, будет такой,как показано ниже.Ввод 0-ля будет вызывать возврат хода.Для выхода из программы нужно ввести отрицательное число. 1 x = x + 1 m = m + 1 COLOR 7 2 PRINT "y"; m; "="; INPUT y IF y = 0 THEN 10 IF y < 0 THEN END y(m) = y k = 1.2 FOR i = 1 TO m FOR j = 1 TO IF (y(i)=y(j) OR ABS(x(i) - x(j)) = ABS(y(i) - y(j))) AND i <> j THEN SOUND 1000, 2 GOTO 2 END IF NEXT NEXT xg% = INT(85 + 40 * k * x): xg%(m) = xg% yg% = INT(450 - 40 * k * y): yg%(m) = yg% IF POINT(xg% - 16, yg% - 19) = 8 THEN PUT (xg% - 14, yg% - 17), a%, PSET ELSE PUT (xg% - 14, yg% - 17), b%, AND END IF IF m = 8 THEN 5 GOTO 1 5 PRINT "Ты выиграл!": SLEEP: END
10 IF POINT(xg%(m - 1) - 16, yg%(m - 1) - 19) = 8 THEN PAINT (xg%(m - 1), yg%(m - 1)), 8 ELSE PAINT (xg%(m - 1), yg%(m - 1)), 15 END IF m = m - 1 x = x - 1 GOTO 2 **************************************************************** Если требуется продемонстрировать позицию на доске,используется следующая программа.Она содержит генератор позиций, как 1-я, и подпрограмму ”доска” как предыдущая.Только ферзи рисуются в виде кружков.Вводится номер позиции,т.е. число от 1 до 92.Для выхода ввести 0.
DECLARE SUB doska () CLS DEFINT A-I DIM a(92), b(92), c(92), d(92), e(92), f(92), g(92), h(92) FOR a = 1 TO 8 FOR b = 1 TO 8 IF b = a THEN 8 IF ABS(b - a) = 1 THEN 8 FOR c = 1 TO 8 IF c = a OR c = b THEN 7 IF ABS(c - b) = 1 OR ABS(c - a) = 2 THEN 7 FOR d = 1 TO 8 IF d = a OR d = b OR d = c THEN 6 IF ABS(d - c) = 1 OR ABS(d - b) = 2 OR ABS(d - a) = 3 THEN 6 FOR e = 1 TO 8 IF e = a OR e = b OR e = c OR e = d THEN 5 IF ABS(e - d) = 1 OR ABS(e - c) = 2 OR ABS(e - b) = 3 OR ABS(e - a) = 4 THEN 5 FOR f = 1 TO 8 IF f = a OR f = b OR f = c OR f = d OR f = e THEN 4 IF ABS(f - e) = 1 OR ABS(f - d) = 2 OR ABS(f - c) = 3 OR ABS(f - b) = 4 OR ABS(f - a) = 5 THEN 4 FOR g = 1 TO 8 IF g = a OR g = b OR g = c OR g = d OR g = e OR g = f THEN 3 IF ABS(g - f) = 1 OR ABS(g - e) = 2 OR ABS(g - d) = 3 OR ABS(g - c) = 4 OR ABS(g - b) = 5 OR ABS(g - a) = 6 THEN 3 FOR h = 1 TO 8 IF h = a OR h = b OR h = c OR h = d OR h = e OR h = f OR h = g THEN 2 IF ABS(h - g) = 1 OR ABS(h - f) = 2 OR ABS(h - e) = 3 OR ABS(h - d) = 4 OR ABS(h - c) = 5 OR ABS(h - b) = 6 OR ABS(h - a) = 7 THEN 2 i = i + 1 a(i) = a: b(i) = b: c(i) = c: d(i) = d: e(i) = e: f(i) = f: g(i) = g: h(i) = h PRINT i; " "; "a"; a; " "; "b"; b; " "; "c"; c; " "; "d"; d; PRINT " "; "e"; e; " "; "f"; f; " "; "g"; g; " "; "h"; h 2 NEXT h 3 NEXT g 4 NEXT f 5 NEXT e 6 NEXT d 7 NEXT c 8 NEXT b NEXT a CLS 10 INPUT "i="; p IF p > 92 THEN PRINT "повторить": GOTO 10 IF p = 0 THEN END CALL doska k = 1.2 x = 1 y = a(p) GOSUB 100 SLEEP 1 x = 2 y = b(p) GOSUB 100 SLEEP 1 x = 3 y = c(p) GOSUB 100 SLEEP 1 x = 4 y = d(p) GOSUB 100 SLEEP 1 x = 5 y = e(p) GOSUB 100 SLEEP 1 x = 6 y = f(p) GOSUB 100 SLEEP 1 x = 7 y = g(p) GOSUB 100 SLEEP 1 x = 8 y = h(p) GOSUB 100 COLOR 7 PRINT p; " "; "a"; a(p); " "; "b"; b(p); " "; "c"; c(p); " "; "d"; d(p); PRINT " "; "e"; e(p); " "; "f"; f(p); " "; "g"; g(p); " "; "h"; h(p) GOTO 10 END 100 xg = 85 + 40 * k * x yg = 450 - 40 * k * y CIRCLE (xg, yg), 10, 5 PAINT (xg, yg), 5 RETURN
DEFSNG A-I SUB doska k = 1.2 SCREEN 12 LINE (0, 0)-(640, 480), 15, BF COLOR 6 'запись используемых символов LOCATE (1), (5): PRINT "A" DIM a%(100) GET (32, 0)-(38, 15), a% LOCATE (1), (5): PRINT "B" DIM b%(100) GET (32, 0)-(38, 15), b% LOCATE (1), (5): PRINT "C" DIM c%(100) GET (32, 0)-(38, 15), c% LOCATE (1), (5): PRINT "D" DIM d%(100) GET (32, 0)-(38, 15), d% LOCATE (1), (5): PRINT "E" DIM e%(100) GET (32, 0)-(38, 15), e% LOCATE (1), (5): PRINT "F" DIM f%(100) GET (32, 0)-(38, 15), f% LOCATE (1), (5): PRINT "G" DIM g%(100) GET (32, 0)-(38, 15), g% LOCATE (1), (5): PRINT "H" DIM h%(100) GET (32, 0)-(38, 15), h% LOCATE (1), (5): PRINT "1" DIM o%(100) GET (32, 0)-(38, 15), o% LOCATE (1), (5): PRINT "2" DIM dv%(100) GET (32, 0)-(38, 15), dv% LOCATE (1), (5): PRINT "3" DIM t%(100) GET (32, 0)-(38, 15), t% LOCATE (1), (5): PRINT "4" DIM ch%(100) GET (32, 0)-(38, 15), ch% LOCATE (1), (5): PRINT "5" DIM p%(100) GET (32, 0)-(38, 15), p% LOCATE (1), (5): PRINT "6" DIM sh%(100) GET (32, 0)-(38, 15), sh% LOCATE (1), (5): PRINT "7" DIM s%(100) GET (32, 0)-(38, 15), s% LOCATE (1), (5): PRINT "8" DIM v%(100) GET (32, 0)-(38, 15), v% LOCATE (1), (5): PRINT "-" DIM mn%(100) GET (32, 0)-(38, 15), mn% CLS 'рисование шахматной доски PAINT (30, 30), 15 LINE (1, 1)-(639, 479), 15, B 'рамка COLOR 8 FOR n = -4 TO 4 LINE (300 - 160 * k, 230 + k * 40 * n)-(300 + 160 * k, 230 + k * 40 * n)'горизонтали NEXT FOR n = -4 TO 4 LINE (300 + 40 * n * k, 230 - 160 * k)-(300 + 40 * n * k, 230 + 160 * k)'вертикали NEXT FOR i = 0 TO 3 FOR j = 0 TO 3 x = 300 - 140 * k + 80 * i * k y = 230 + 140 * k - 80 * j * k PAINT (x, y), 8 NEXT NEXT FOR i = 0 TO 3 FOR j = 0 TO 3 x = 300 - 100 * k + 80 * i * k y = 230 + 100 * k - 80 * j * k PAINT (x, y), 8 NEXT NEXT PUT (300 - 140 * k, 230 + 160 * k), … Продолжение » |
Это позиция из симметрической группы.Ниже - позиция из 11-й группы где никакие 3 ферзя не лежат на одной прямой.
Представляет также интерес проблема заполнения позициями ферзей не атакующих друг друга всей доски(полагаем,что каждая позиция имеет свой цвет).В литературе (в том числе и у Е.Гика – см.ссылку в Википедии в статье “8 ферзей”) написано,что для этого размерность доски должна не делится на 2 или 3.Однако в этой статье Википедии в разделе "Обсуждение " Т.Сильвер выдвинул предположение,что для этого нужно,чтобы размерность доски выражалась простым числом.Первым составным числом,которое не делится на 2 или 3 является 25.Позиции на такой доске рассчитаны,однако вряд ли проверялась возможность заполнения всей доски – для этого требуется существенно больший обьём вычислений.Кроме этого Т.Сильвер предполагает,что таких заполняющих групп должно быть не меньше n-3,где n – размерность доски.Что это справедливо для доски 5*5 можно убедиться и без помощи компьютера. Все позиции на этой доске участвуют в заполнении доски в 2-х группах.Здесь предлагается программа,которая находит эти группы позиций на доске 7*7.Их обнаруживается 4.Номера в группах проставлены вручную – может быть кто-то обнаружит закономерность.Интересно,что диагонали(в первой и последней группах только одна)являются позициями в предыдущей и последующей группах.Сами группы яляются супер-латинскими (или диагональными латинскими) квадратами,где не только в столбцах и строках,но и в диагоналях числа встречаются по одному разу. CLS DEFINT A-I OPEN "ferz7" FOR OUTPUT AS 1 DIM a(50), b(50), c(50), d(50), e(50), f(50), g(50) DIM a1(50), b1(50), c1(50), d1(50), e1(50), f1(50), g1(50) a$ = TIME$ FOR a = 1 TO 7 FOR b = 1 TO 7 IF b = a THEN 8 IF ABS(b - a) = 1 THEN 8 FOR c = 1 TO 7 IF c = a OR c = b THEN 7 IF ABS(c - b) = 1 OR ABS(c - a) = 2 THEN 7 FOR d = 1 TO 7 IF d = a OR d = b OR d = c THEN 6 IF ABS(d - c) = 1 OR ABS(d - b) = 2 OR ABS(d - a) = 3 THEN 6 FOR e = 1 TO 7 IF e = a OR e = b OR e = c OR e = d THEN 5 IF ABS(e - d) = 1 OR ABS(e - c) = 2 OR ABS(e - b) = 3 OR ABS(e - a) = 4 THEN 5 FOR f = 1 TO 7 IF f = a OR f = b OR f = c OR f = d OR f = e THEN 4 IF ABS(f - e) = 1 OR ABS(f - d) = 2 OR ABS(f - c) = 3 OR ABS(f - b) = 4 OR ABS(f - a) = 5 THEN 4 FOR g = 1 TO 7 IF g = a OR g = b OR g = c OR g = d OR g = e OR g = f THEN 3 IF ABS(g - f) = 1 OR ABS(g - e) = 2 OR ABS(g - d) = 3 OR ABS(g - c) = 4 OR ABS(g - b) = 5 OR ABS(g - a) = 6 THEN 3 i = i + 1 a(i) = a: b(i) = b: c(i) = c: d(i) = d: e(i) = e: f(i) = f: g(i) = g PRINT i; " "; "a"; a; " "; "b"; b; " "; "c"; c; " "; "d"; d; PRINT " "; "e"; e; " "; "f"; f; " "; "g"; g PRINT #1, i; " "; "a"; a; " "; "b"; b; " "; "c"; c; " "; "d"; d; PRINT #1, " "; "e"; e; " "; "f"; f; " "; "g"; g 3 NEXT g 4 NEXT f 5 NEXT e 6 NEXT d 7 NEXT c 8 NEXT b NEXT a PRINT #1, " " SLEEP 3 FOR x = 1 TO 4 FOR y = 5 TO 11 IF b(y) = b(x) OR c(y) = c(x) OR d(y) = d(x) OR e(y) = e(x) OR f(y) = f(x) OR g(y) = g(x) THEN 10 FOR z = 12 TO 17 IF b(z) = b(x) OR c(z) = c(x) OR d(z) = d(x) OR e(z) = e(x) OR f(z) = f(x) OR g(z) = g(x) THEN 20 IF b(z) = b(y) OR c(z) = c(y) OR d(z) = d(y) OR e(z) = e(y) OR f(z) = f(y) OR g(z) = g(y) THEN 20 FOR u = 18 TO 23 IF b(u) = b(x) OR c(u) = c(x) OR d(u) = d(x) OR e(u) = e(x) OR f(u) = f(x) OR g(u) = g(x) THEN 30 IF b(u) = b(y) OR c(u) = c(y) OR d(u) = d(y) OR e(u) = e(y) OR f(u) = f(y) OR g(u) = g(y) THEN 30 IF b(u) = b(z) OR c(u) = c(z) OR d(u) = d(z) OR e(u) = e(z) OR f(u) = f(z) OR g(u) = g(z) THEN 30 FOR w = 24 TO 29 IF b(w) = b(x) OR c(w) = c(x) OR d(w) = d(x) OR e(w) = e(x) OR f(w) = f(x) OR g(w) = g(x) THEN 40 IF b(w) = b(y) OR c(w) = c(y) OR d(w) = d(y) OR e(w) = e(y) OR f(w) = f(y) OR g(w) = g(y) THEN 40 IF b(w) = b(z) OR c(w) = c(z) OR d(w) = d(z) OR e(w) = e(z) OR f(w) = f(z) OR g(w) = g(z) THEN 40 IF b(w) = b(u) OR c(w) = c(u) OR d(w) = d(u) OR e(w) = e(u) OR f(w) = f(u) OR g(w) = g(u) THEN 40 FOR t = 30 TO 36 IF b(t) = b(x) OR c(t) = c(x) OR d(t) = d(x) OR e(t) = e(x) OR f(t) = f(x) OR g(t) = g(x) THEN 50 IF b(t) = b(y) OR c(t) = c(y) OR d(t) = d(y) OR e(t) = e(y) OR f(t) = f(y) OR g(t) = g(y) THEN 50 IF b(t) = b(z) OR c(t) = c(z) OR d(t) = d(z) OR e(t) = e(z) OR f(t) = f(z) OR g(t) = g(z) THEN 50 IF b(t) = b(u) OR c(t) = c(u) OR d(t) = d(u) OR e(t) = e(u) OR f(t) = f(u) OR g(t) = g(u) THEN 50 IF b(t) = b(w) OR c(t) = c(w) OR d(t) = d(w) OR e(t) = e(w) OR f(t) = f(w) OR g(t) = g(w) THEN 50 FOR r = 37 TO 40 IF b(r) = b(x) OR c(r) = c(x) OR d(r) = d(x) OR e(r) = e(x) OR f(r) = f(x) OR g(r) = g(x) THEN 60 IF b(r) = b(y) OR c(r) = c(y) OR d(r) = d(y) OR e(r) = e(y) OR f(r) = f(y) OR g(r) = g(y) THEN 60 IF b(r) = b(z) OR c(r) = c(z) OR d(r) = d(z) OR e(r) = e(z) OR f(r) = f(z) OR g(r) = g(z) THEN 60 IF b(r) = b(u) OR c(r) = c(u) OR d(r) = d(u) OR e(r) = e(u) OR f(r) = f(u) OR g(r) = g(u) THEN 60 IF b(r) = b(w) OR c(r) = c(w) OR d(r) = d(w) OR e(r) = e(w) OR f(r) = f(w) OR g(r) = g(w) THEN 60 IF b(r) = b(t) OR c(r) = c(t) OR d(r) = d(t) OR e(r) = e(t) OR f(r) = f(t) OR g(r) = g(t) THEN 60 PRINT a(x); b(x); c(x); d(x); e(x); f(x); g(x) PRINT a(y); b(y); c(y); d(y); e(y); f(y); g(y) PRINT a(z); b(z); c(z); d(z); e(z); f(z); g(z) PRINT a(u); b(u); c(u); d(u); e(u); f(u); g(u) PRINT a(w); b(w); c(w); d(w); e(w); f(w); g(w) PRINT a(t); b(t); c(t); d(t); e(t); f(t); g(t) PRINT a(r); b(r); c(r); d(r); e(r); f(r); g(r) PRINT " " PRINT #1, a(x); b(x); c(x); d(x); e(x); f(x); g(x) PRINT #1, a(y); b(y); c(y); d(y); e(y); f(y); g(y) PRINT #1, a(z); b(z); c(z); d(z); e(z); f(z); g(z) PRINT #1, a(u); b(u); c(u); d(u); e(u); f(u); g(u) PRINT #1, a(w); b(w); c(w); d(w); e(w); f(w); g(w) PRINT #1, a(t); b(t); c(t); d(t); e(t); f(t); g(t) PRINT #1, a(r); b(r); c(r); d(r); e(r); f(r); g(r) PRINT #1, " "
60 NEXT r 50 NEXT t 40 NEXT w 30 NEXT u 20 NEXT z 10 NEXT y NEXT x
(в QBasice,конечно,переносы строк запрещены - учесть при копировании). 1 a 1 b 3 c 5 d 7 e 2 f 4 g 6 2 a 1 b 4 c 7 d 3 e 6 f 2 g 5 3 a 1 b 5 c 2 d 6 e 3 f 7 g 4 4 a 1 b 6 c 4 d 2 e 7 f 5 g 3 5 a 2 b 4 c 1 d 7 e 5 f 3 g 6 6 a 2 b 4 c 6 d 1 e 3 f 5 g 7 7 a 2 b 5 c 1 d 4 e 7 f 3 g 6 8 a 2 b 5 c 3 d 1 e 7 f 4 g 6 9 a 2 b 5 c 7 d 4 e 1 f 3 g 6 10 a 2 b 6 c 3 d 7 e 4 f 1 g 5 11 a 2 b 7 c 5 d 3 e 1 f 6 g 4 12 a 3 b 1 c 6 d 2 e 5 f 7 g 4 13 a 3 b 1 c 6 d 4 e 2 f 7 g 5 14 a 3 b 5 c 7 d 2 e 4 f 6 g 1 15 a 3 b 6 c 2 d 5 e 1 f 4 g 7 16 a 3 b 7 c 2 d 4 e 6 f 1 g 5 17 a 3 b 7 c 4 d 1 e 5 f 2 g 6 18 a 4 b 1 c 3 d 6 e 2 f 7 g 5 19 a 4 b 1 c 5 d 2 e 6 f 3 g 7 20 a 4 b 2 c 7 d 5 e 3 f 1 g 6 21 a 4 b 6 c 1 d 3 e 5 f 7 g 2 22 a 4 b 7 c 3 d 6 e 2 f 5 g 1 23 a 4 b 7 c 5 d 2 e 6 f 1 g 3 24 a 5 b 1 c 4 d 7 e 3 f 6 g 2 25 a 5 b 1 c 6 d 4 e 2 f 7 g 3 26 a 5 b 2 c 6 d 3 e 7 f 4 g 1 27 a 5 b 3 c 1 d 6 e 4 f 2 g 7 28 a 5 b 7 c 2 d 4 e 6 f 1 g 3 29 a 5 b 7 c 2 d 6 e 3 f 1 g 4 30 a 6 b 1 c 3 d 5 e 7 f 2 g 4 31 a 6 b 2 c 5 d 1 e 4 f 7 g 3 32 a 6 b 3 c 1 d 4 e 7 f 5 g 2 33 a 6 b 3 c 5 d 7 e 1 f 4 g 2 34 a 6 b 3 c 7 d 4 e 1 f 5 g 2 35 a 6 b 4 c 2 d 7 e 5 f 3 g 1 36 a 6 b 4 c 7 d 1 e 3 f 5 g 2 37 a 7 b 2 c 4 d 6 e 1 f 3 g 5 38 a 7 b 3 c 6 d 2 e 5 f 1 g 4 39 a 7 b 4 c 1 d 5 e 2 f 6 g 3 40 a 7 b 5 c 3 d 1 e 6 f 4 g 2
1 3 5 7 2 4 6 :1 2 4 6 1 3 5 7 :6 3 5 7 2 4 6 1 :14 4 6 1 3 5 7 2 :21 5 7 2 4 6 1 3 :28 6 1 3 5 7 2 4 :30 7 2 4 6 1 3 5 :37
1 4 7 3 6 2 5 :2 2 5 1 4 7 3 6 :7 3 6 2 5 1 4 7 :15 4 7 3 6 2 5 1 :22 5 1 4 7 3 6 2 :24 6 2 5 1 4 7 3 :31 7 3 6 2 5 1 4:38
1 5 2 6 3 7 4 :3 2 6 3 7 4 1 5 :10 3 7 4 1 5 2 6 :17 4 1 5 2 6 3 7 :19 5 2 6 3 7 4 1 :26 6 3 7 4 1 5 2 :34 7 4 1 5 2 6 3 :39
1 6 4 2 7 5 3 :4 2 7 5 3 1 6 4 :11 3 1 6 4 2 7 5 :13 4 2 7 5 3 1 6 :20 5 3 1 6 4 2 7 :27 6 4 2 7 5 3 1 :35 7 5 3 1 6 4 2 :40 Причём эти латинские квадраты являются ортогональными. а также заполнение доски 7*7 позициями первой группы. |