ферзи окрашены в желтый цвет, а поздравление выводится ярко-красным цветом. Для вывода изображений в этой программе использован рисующий процессор. Построение изображений квадрата шахматной доски, маркера и ферзя выполняются подпрограммами.

Вы наверно уже обратили внимание, что в заключение каждого занятия даются намеки или даже прямые подсказки о способе решения задачи. Казалось бы программист не обязан знать решение программируемой задачи. Но как можно отладить программу не имея хотя бы одного решения? Да и с точки зрения самооценки своих способностей стыдно не знать решения. В этом смысле иногда следует в качестве усилителя умственных способностей использовать компьютерную программу решения задачи. Все решения задачи о 8 ферзях можно отыскать прямым перебором.

Процедура перебора очень проста. Поставив ферзя на некоторое место по первой вертикали (8 вариантов), устанавливаем другого на второй вертикали но на той горизонтали, на которой стоит предыдущий (7 вариантов) и так далее. Нетрудно подсчитать, что количество таких вариантов будет равно 8*7*6*5*4*3*2=40320. Поскольку в каждом из этих вариантов ферзи стоят на разных вертикалях и горизонталях, то остается их проверка расстановок на совпадения по диагоналям. Если же ставить ферзей с учетом битых полей по диагоналям, то количество проверяемых вариантов резко сократится, так как большинство вариантов будет забраковано до установки всех ферзей. Важно только соответствующим образом провести этот отбор, не пропуская ни одного варианта.

В программе поиска решений используется другая математическая модель расстановки ферзей с массивом из 8 целых чисел. В этой модели номером вертикали считается значение индекса массива, а номером горизонтали — хранящееся в ячейке массива число от 1 до 8. (Размерность массива удается сократить потому, что на одной вертикали может быть поставлен только один ферзь). Заметьте, что алгоритм решения задачи и алгоритм игры построены различным образом. В игре убираются ранее установленные фигуры, которые находятся на одной и той же горизонтали, вертикали или диагонали с вновь поставленным ферзем. Здесь же нам важно сохранить предыдущую расстановку для перебора всех вариантов! Постепенное заполнение массива должно производиться с учетом возможности записи числа в ячейку со следующим значением индекса. Если удается заполнить все ячейки массива, то этот набор чисел является решением. Если продвижение не удается, то нужно вернуться назад на один шаг и продолжать проверку следующего варианта расстановки.

Алгоритм поиска вариантов расстановки может быть реализован в подпрограмме, которая обращается сама к себе. Использование такого рода подпрограмм, называемых рекурсивными, позволяет зачастую очень эффективно программировать многие задачи. И потому автор решился привести этот пример неигровой программы.

Основная программа только выводит на экран заголовок, задает начальный номер столбца и устанавливает в 0 счетчик количества решений. Затем она обращается к подпрограмме, которая сама находит и выводит на экран все решения. Так что после возврата из подпрограммы ос-