— либо строка с номером
Запишем кусок программы, который различает эти три случая:
С: ЕСЛИ
ИНАЧЕ искать первое свободное поле на строке
ЕСЛИ нет таких полей ТО СБ
ИНАЧЕ СОК КОНЕЦ_ЕСЛИ
КОНЕЦ_ЕСЛИ
Рассмотрим теперь каждое из подсостояний.
СОК: есть свободное место в точке
Формально:
СОК: занять
Если строка
СБ:
ЕСЛИ k = 0 ТО Я
ИНАЧЕ найти место
найти первое свободное поле на строке
ЕСЛИ нет таких полей ТО СБ
ИНАЧЕ СОК
КОНЕЦ_ЕСЛИ
КОНЕЦ_ЕСЛИ
Когда 8 ферзей уже размещены, нужно записывать решение. Бесполезно искать другое место для восьмого ферзя, потому что если на восьмой строке и есть свободное место, то только одно. Таким образом, строка 8 оказывается полностью исследованной и нужно снова размещать 7 предыдущих ферзей. А состояние, в котором строка 8 полностью исследована, — это состояние СБ с
С8: выписать решение;
найти место
освободить 8,
Остается пустить этот процесс в ход. В начале ни один ферзь в игре не участвует и, следовательно,
ПРОГРАММА:
Объединим куски. Мы получим программу, реализующую автомат, как мы уже видели в игре 12. Вы можете рассматривать имена, написанные прописными буквами (С, СБ, СОК, С8, ПРОГРАММА) как метки, позволяющие отсылать к части программы, в начале которой стоят эти имена со знаком «:» после них, и как инструкцию ПЕРЕЙТИ К, если они указаны в конце последовательности операций. Поэтому все это непосредственно переводится на совершенно любой язык.
ПРОГРАММА:
С: ЕСЛИ
ИНАЧЕ искать первое свободное поле на строке
ЕСЛИ нет таких полей ТО СБ
ИНАЧЕ СОК КОНЕЦ_ЕСЛИ
КОНЕЦ_ЕСЛИ
СОК: занять
СБ:
ЕСЛИ
ИНАЧЕ найти место
ИСКАТЬ первое свободное поле на строке
ЕСЛИ нет таких полей ТО СБ
ИНАЧЕ СОК
КОНЕЦ_ЕСЛИ
КОНЕЦ_ЕСЛИ
С8: выписать решение;
найти место
освободить 8,
Мы можем улучшить эту программу. Неприятно иметь необходимость находить заново место ферзя в строке, тем более, что знание этого места необходимо дли вывода на экран полученного решения. Заменим
— в СБ:
искать первое свободное поле на строке
ЕСЛИ таких полей нет ТО СБ
ИНАЧЕ СОК КОНЕЦ_ЕСЛИ
— в С:
искать первое свободное поле на строке
ЕСЛИ таких полей нет ТО СБ
ИНАЧЕ СОК КОНЕЦ_ЕСЛИ