Программирование игр и головоломок
Шрифт:
Я обратил ваше внимание на эту задачу, поскольку ее решения всюду приведены. Ее можно в высшей степени элегантным образом решить с помощью рекурсивной процедуры. Но нетрудно дать решение и в итеративной форме,
Деликатный вопрос связан с представлением шахматной доски. Но и возможности этого выбора также обсуждаются в известных книгах.. Что же тогда остается найти?
Если у вас нет этих книг, то остается найти решение. Нет — решения, поскольку их 92. Но не все они существенно различны, так как шахматная доска обладает симметриями.
Поэтому пытайтесь искать только основные решения, исходя
В этом примере вам не следует бояться сложности. Даже самые плохие программы будут все еще достаточно быстры…
?** Головоломка 21. X ферзей.
Поставить на шахматной доске 8 ферзей так, чтобы они друг другу не угрожали, можно. Но трудности, с которыми мы встретились при попытке достичь решения без помощи компьютера, ясно показывают, что нет необходимости в 8 ферзях, чтобы блокировать всю шахматную доску.
Каково наименьшее число ферзей, необходимых для блокирования шахматной доски, так, чтобы не было возможности поставить ни одной фигуры ни на одно поле, чтобы один из уже стоящих ферзей не мог эту фигуру взять?
Так как я вам не задал x, то вам нужно пытаться заставить x либо расти, либо уменьшаться. Впрочем, в этой задаче наши дела идут хуже, чем с 8 ферзями. В предыдущей задаче мы знали, что в каждой строке и каждом столбце обязательно должен быть ферзь. Если ферзей меньше 8, то это уже неверно.
* Головоломка 22. Домино.
Маленькая прелестная головоломна, совсем не трудная. Она была предложена на испытании на проницательность на конкурсе организации АФСЕТ по программированию в 1981 году.
Берутся 7 костяшек из одного набора домино. Напомним, что эти шашки сделаны из двух частей, на каждой из которых либо ничего не написано (чистая сторона), либо очки в числе от 1 до 6,
Задача состоит в том, чтобы образовать из этих 7 костей все возможные цепи, состыковывая костяшки домино частями с равными количествами точек. Нет никакой уверенности, что такая цепь существует.
Не ведите себя так, как некоторые из соревнующихся на этом конкурсе. Я тогда входил в жюри. Мы должны были оценивать работы соревнующихся. Если бы я принимал решения единолично, я потребовал бы, чтобы мне были представлены тексты программ, и я бы судил по самим произведениям. Но другие члены жюри нашли более длинный и более сложный метод, Они приготовили специальные тесты. Они должны были быть испытаны на программах соревнующихся, и нужно было подсчитать число правильных ответов, чтобы расклассифицировать соревнующихся. Новое обсуждение: я выдвигаю оценку, что и один-единственный неверный ответ выражает ошибочность программы и, следовательно, выводит ее из конкурса. В конце концов было решено, что так и будем делать. Все программы, содержащие ошибку, будут рассматриваться как неверные, Если две команды получат одинаково верные ответы, то мы еще раз детально изучим полученные результаты, стараясь разгадать природу ошибки при переходе к данному тесту от уже удавшихся, чтобы отдать одному из них предпочтение. Вот нам и досталось: один ив соревнующихся, думая, что с удавшимися тестами это согласуется, пытался упростить программу для домино. Он сказал себе, что вне всякого сомнения, будут даны кости, из которых никаких цепей ставить нельзя. Его программа читала последовательность костей домино и сообщала НЕВОЗМОЖНО без каких-либо других вычислений. Если бы я не настаивал на своем так решительно, то он был бы не хуже других…
Не поступайте так. Эта задача при всем том нетрудная… Рис. 29 дает пример цепи.
* Головоломка 23. Последовательность 0—1—4—6.
Это головоломка, на которую я натолкнулся, работая над своей диссертацией на ученую степень по
Тогда получаемые из них 6 различных пар приводят к расстояниям между антеннами, пропорциональным следующим числам:
0—1 1
4—6 2
1—4 3
0—4 4
1—6 5
0—6 6
Можно сформулировать задачу по-другому. Нужно найти последовательность натуральных чисел a1, a2, …, an — последовательность, которую можно предполагать возрастающей — такую, чтобы попарные разности членов этой последовательности aj– ai (j > i) были попарно различны и образовывали последовательность всех целых чисел от 1 до n(n– 1)/2.
Это — еще и проблема трансформатора (см. рис. 30), Если включить во вторичную обмотку 4 выхода так, чтобы число витков между первым и другими выходами находилось в отношениях 1, 4 и 6, то можно получить 6 напряжений на выходе, образующих арифметическую прогрессию.
Опустим другие физические задачи, порождающие такие последовательности. Четырехчленная последовательность 0—1—4—6, по-видимому, является наибольшей последовательностью, обладающей свойством порождать последовательность первых целых чисел, не пропуская и не повторяя дважды ни одного из них, при попарном вычитании членов этой последовательности.
Так, для 5 целых можно образовать 10 разностей. Поэтому крайние члены должны быть a1 = 0, a5 = 10. Чтобы получить в виде разности 9 из двух членов последовательности, нужно, чтобы либо было a2 = 1, и тогда a5– a2 = 9, либо a4 = 9. Эти два решения легко получаются одно из другого операцией симметрии, Поэтому положим a2 = 1.
К этому моменту мы получили уже a1 = 0, a2 = 1, a5 = 10. Чтобы получить разность, равную 8, нужно взять
— либо a3 = 2, но тогда разность, равная 1, получается дважды:
a3– a2 = a2– a1
— либо a4 = 8,