Исходник программы, показывающей пример решения классической задачи с кувшинами для воды на Delphi: двое друзей, у которых есть восьмилитровый кувшин воды, хотят разделить ее поровну. У них также есть две пустые банки: одна на пять литров, другая - на три. Как каждый из них может отмерить ровно 4 литра воды?.
В кувшинах нет промежуточной меры количества, содержащегося в кувшине, поэтому при переливании переносится меньшее из количества воды первого кувшина «От» и второй доступной неиспользованной емкости кувшина «К». И, конечно, чем меньше создано ходов, тем лучше.
Программа использует процедуру Дейкстра из класса TGraphSearch для поиска решений. В верхней части формы пользователь выбирает количество кувшинов, вместимость каждого кувшина и общее количество воды, которое должно быть распределено.
Когда любой из объемов изменяется, вызов JarBtnClick генерирует узлы для всех возможных способов распределения указанного объема воды по доступным кувшинам. Затем класс TComboset Combos используется для создания всех пар кувшинов из доступного числа. Если первый из пары может налить количество > 0 во вторую из пары, создается ребро графа, соединяющее оба кувшина.
После создания узлов и ребер в TComboboxes, StartCB и EndCb загружаются доступные узлы, из которых пользователь выбирает начальную и конечную конфигурации jar. Когда начальная конфигурация изменяется в StartCB, делается попытка оценить результат для всех целевых узлов в EndCB. Для четырех кувшинов большой емкости этот процесс может занять много времени, поэтому предусмотрена кнопка «Стоп», чтобы прервать процесс.
Игра пользователя контролируется выходом OnDrawCell в TStringGrid, который рисует масштабированные изображения кувшинов (они больше похожи на мензурки, ну да и ладно). Пользователи нажимают на изображения, определяющие от и до кувшинов, и ход отображается в области отображения TMemo.