TURBO PASCAL |
Новости
|
СтекЦель: изучение фундаментальной абстрактной структуры - стека. Стек - это упорядоченный набор элементов, в котором размещение новых элементов и удаление осуществляется только с одного конца. Стек предназначен для хранения элементов, доступных естественным путем в вершине списка. Представим шампур, на который нанизаны нарезанные овощи, подготовленные для шашлыка. Пусть овощи расположены в следующем порядке: лук, грибочек, зеленый перец и лук. Перед приготовлением шашлыка гость сообщает, что он не ест грибов и их необходимо убрать. Эта просьба означает удалить лук, удалить грибочек и затем вновь нанизать лук. Если гость не любит зеленый перец или лук, это доставит повару больше проблем. В структуре стека важнейшее место занимают операции, добавляющие и удаляющие элементы. Операция Push добавляет в вершину стек, а операция Pop извлекает элемент с вершины стека. type Давайте решим задачу с использованием стека. Нужно так расставить 8 ферзей на шахматной доске, чтобы ни один из них не угрожал другому. Эта задача демонстрирует очень интересный прием в программировании - поиск с возвращениями. Хотя на доске 64 клетки, взять 8 из них можно 64!/(56!*8!)=4 426 165 368 способами. Проверять все эти комбинации - большая работа даже для ЭВМ. Поставим одного ферзя, затем ("безопасно") второго, третьего и т.д. Для указанного размещения 5 ферзей вы не найдете подходящей позиции для 6-го ферзя. Наступил черед рационализации. Не будем отбрасывать достигнутое! Сделаем лишь один шаг назад - изменим позицию ферзя Ф5, вновь попытаемся поставить Ф6 и лишь при безуспешной попытке сделаем второй шаг назад и т.д. Это стратегия планомерного отступления и прорыва вперед при первой возможности. Кто бы мог подумать, что будет столько тупиков! К первому полному решению приходим, побывав в 42 тупиках! На месте остается лишь Ф1! Тем не менее перебор резко сокращается и в ЭВМ нахождением 96 полных решений займет краткий миг. Для маркировки вертикалей вместо букв А..H используем цифры 1..8. Это значения переменной Х. Аналогично переменная Y обозначает текущую горизонталь. Занятые горизонтали отмечаем значениями R[Y]=1; если снимаем ферзя (делаем шаг назад) - R[Y]=0. Для идентификации диагоналей, направленных как главная диагональ, используем значения X+Y, для прочих - значение Y-X. Эти значения суммы и разности одинаковы для всех клеток лежащих на диагонали. program Stack; Заметим, что в основной программе шахматами и "не пахнет". Действительно, метод универсален, он применяется на графах и в других областях. Итак, на сегодняшнем занятии Вы познакомились с абстрактной структурой данных - стеком. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |