— выбрать случайным образом направление перемещения (целое от 1 до 8); если это перемещение невозможно — перейти к следующему перемещению, пока не будет найдено возможное перемещение;
— передвинуть
— если
Опыт показывает, что чаще всего эта программа не останавливается.
Так как есть основное направление перемещения, подлежащее реализации (диагональ игры), то я изменил случайный выбор так, чтобы сделать более частными перемещения влево и вверх или вверх и влево.
Так как у меня еще были и другие задачи, я решил останавливать случайный выбор, когда
Остальное просто.
Игра 5.
Эта игра не представляет никаких трудностей. Пусть вы не пытаетесь гарантировать Тони возможность выхода. В программе — никакой стратегии: один ход на два поля, два препятствия на горизонтальной линии на двух свободных полях (вы выбираете клетку случайным образом. Если она или ее соседка справа не свободны, то вы повторяете выбор. Если они свободны — вы их помечаете. Тем хуже для Тони, если он накрыт), два препятствия случайным образом на двух вертикальных полях.
Если вы решили оставить Тони шансы на спасение, действуйте, как в предыдущей программе. Вы случайным образом выбираете путь и обозначаете его так, чтобы никакое препятствие на него сверху не падало. Но вы не выводите на экран этих обозначений.
2. Игры с числами
Головоломка 3.
Я нашел это упражнение в монографии, посвященной языку Пролог. Предложенное там решение действует методом проб и ошибок. Но задача решается намного проще.
Как всегда, полностью определим задачу. Искомое число представляется в десятичной системе последовательностью цифр
Умножая на 5, получаем
5
Отсюда следует, что
Вы можете также действовать слева направо:
5
Деля левую цифру на 5, вы получаете
Остальное оставляю исследовать вам.
Головоломка 4.
Обычно я бываю глубоко разочарован тем, что нахожу в книгах по информатике или по математике касательно квадратных корней. Чаще всего вам предлагают метод Ньютона: пусть вам нужно извлечь квадратный корень из числа
Вне всякого сомнения, вы можете взять
чтобы иметь дело только с целыми числами, то в качестве последовательных значений и вы получите
Чтобы использовать здесь этот алгоритм, вы должны написать программу целочисленного деления двух целых чисел большой длины.
Другой способ действия основан на том факте, что разность двух последовательных квадратов есть нечетное число:
(
так что последовательные разности являются последовательными нечетными числами. Поэтому можно видеть, что сумма нечетных чисел от 1 до 2
50 ? 1 = 49,
49 ? 3 = 46,
46 ? 5 = 41,
41 ? 7 = 34,
34 ? 9 = 25,
25 ? 11 = 14,
14 ? 13 = 1.
Нельзя продолжать, не получая отрицательной разности. Последнее нечетное вычитаемое равно 13, поэтому корень есть (13 + 1)/2 = 7 (и остаток 1). Этот способ гораздо лучше подходит для распространения на случай очень больших чисел, потому что вам требуется реализовать только две операции:
— прибавить 2 к большому числу;
— вычесть одно большое число из другого.
Но число шагов цикла равно искомому квадратному корню, а он может оказаться весьма большим.