новной программе остается только вывести количество полученных решений.
DIM q(l TO 8) AS INTEGER
'массив положений ферзей по вертикали CLS 'очистка экрана PRINT "РЕШЕНИЕ ЗАДАЧИ О РАССТАНОВКЕ 8 ФЕРЗЕЙ"
'с использованием рекурсии answers% = 0 'для количества решений задачи j% = 1 'номер вертикали в начале перебора GOSUB check 'на процедуру поиска решений PRINT "Количество решений ="; answers%
'вывод количества решений END
Всю остальную работу по поиску решений и выводу их на дисплей выполняет подпрограмма .check:
Очень интересно и поучительно разобраться каким образом эта небольшая по объему подпрограмма делает такую громоздкую работу. Она начинает перебор вариантов на очередной вертикали с выбора номера горизонтали равного 1.
i% = 1 'номер горизонтали в начале перебора DO 'цикл проверки по вертикалям beaten% = 0 'признак небитого поля
Цикл начинается с проверки того, пробито ли очередное поле уже расставленными ферзями. Если это поле находится на одной горизонтали или диагонали с любым из ранее установленных ферзей, то оно битое.
FOR k% = 1 ТО j% - 1 'цикл проверки по предыдущим вертикалям temp% = ABS(i% - q(k%)) 'для проверки диагоналей IF temp% = О OR tempt = j% - k% THEN beaten% = 1: EXIT FOR
NEXT k%
Если проверяемое поле не пробито, то в массив заносится положение очередного ферзя по горизонтали.
IF beaten% = О THEN 'если поле небитое, то
q(j%) = i% 'запомнить номер горизонтали Если при этом номер проверяемой вертикали равен 8, то полученное решение выводится на экран.
IF ^% = в THEN 'если это последняя вертикаль, то answers% = answers% + 1 'счет количества решений answers = 0 ' заготовка для кода FOR 1% = 1 ТО 8 'цикл вычисления кода решения
answers = 10 * answers + q(l%) 'добавлен номер строки NEXT 1%
PRINT answers; 'вывести решение на экран IF answers% MOD 8=0 THEN PRINT
'перевод строки после 8 решений
Если последняя вертикаль еще не достигнута, то нужно продолжить поиск небитого поля на следующей вертикали вызовом той же самой подпрограммы. На первый взгляд это может показаться враньем наподобие того, как барон Мюнхгаузен вытащил за волосы сам себя из болота. Но тем не менее при надлежащем составлении программ рекурсия работает.