ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.10.2023
Просмотров: 422
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
30 Глава 1
Это довольно просто, но вы должны сделать все так, чтобы не включилась сигнализация, которая работает следующим образом.
На каждом Кратцце есть несколько кристаллических силовых гемм
Квиникрис, каждая из которых имеет форму звезды. Каждый рецеп- тор оснащен четырьмя датчиками, которые загораются в случае, если количество Квиникрис в колонне над рецептором четное. Си- рена включается, если количество загоревшихся датчиков равно од- ному. Обратите внимание, что оба рецептора оснащены отдельной сигнализацией, то есть у вас не может возникнуть ситуации, когда только один датчик горит для левого или для правого рецептора. Хо- рошая новость в том, что каждая сигнализация оснащена супрессо- ром, не позволяющим сигнализации сработать, если нажата кнопка.
Если бы вы могли нажать оба супрессора одновременно, то задача была бы легкой, но вы не можете, так как у вас лишь короткие чело- веческие руки, а не длинные щупальца, как у Кварраси.
Принимая во внимание вышеописанное, как вы передвине- те Кратцц для открытия двери, не активируя при этом одну из сигнали заций?
Начальная конфигурация приведена на рис. 1.13. В этой конфи- гурации все три Кратцца находятся в правом рецепторе. Для поясне- ния на рис. 1.14 показан пример неудачного решения: перенос само- го верхнего Кратцца в левый рецептор приводит к срабатыванию правого рецептора. Вам может показаться, что мы могли бы избе- жать срабатывания сигнализации, воспользовавшись супрессором, но помните, что мы только что переместили правый Кратцц в левый рецептор и, следовательно, находимся в трех метрах от супрессора правого рецептора.
Рис. 1.13. Начальная конфигурация для задачи замок Кварраси. Вы должны перенести три
бруска Кратцца, находящихся в данный момент в правом рецепторе, в левый, не активи-
ровав при этом сигнализацию. Датчик срабатывает, когда четное число звездообразных
Квиникрис находится в колонне над этим датчиком, при этом сигнализация срабатывает,
когда загорается один из подключенных датчиков. Супрессоры могут предотвратить сра-
батывание сигнализации, но только для того рецептора, рядом с которым вы находитесь
Стратегии решения задач 31
Рис. 1.14. Замок Кварраси в режиме сработавшей сигнализации. Вы только что передви-
нули Кратцц в левый рецептор, то есть правый рецептор для вас вне досягаемости. Второй
датчик правой сигнализации загорелся, так как в колонне над ним находится четное количе-
ство Квиникрис, сигнализация срабатывает, когда загорается один из датчиков
Прежде чем продолжать чтение, возьмите небольшую паузу, что- бы изучить задачу и попытаться найти решение. В зависимости от вашей собственной точки зрения, эта задача может оказаться не та- кой сложной, какой кажется на первый взгляд. Серьезно, подумайте над ее решением прежде, чем продолжать чтение!
Вы подумали над задачей? Смогли ли вы найти решение? Суще- ствует два пути ответа на этот вопрос. Первый путь — это путь проб и ошибок: методически пробовать передвигать различные Кратццы и возвращаться на предыдущие шаги при достижении состояния сра- батывания сигнализации до тех пор, пока не найдете работающую последовательность движений.
Второй путь — понять, что данная головоломка — лишь уловка.
Если вы не поняли, в чем уловка, то объясню: перед нами лишь зада- ча с лисицей, гусем и кукурузой в изысканной маскировке. Несмотря на то, что правила для срабатывания сигнализации описаны лишь в общем, существует только определенное количество сочетаний для каждого замка. Имея лишь три Кратцца, все, что нужно знать, — это то, какие комбинации Кратццев в рецепторе считаются допустимы- ми. Если мы обозначим три Кратцца как верхний, средний и нижний, то получим следующие комбинации, вызывающие срабатывание сиг- нализации, это «верхний и средний» и «средний и нижний». Если мы переименуем верхний в лисицу, средний в гуся, а нижний — в кукурузу, то комбинации, вызывающие трудности в этой задаче аналогичны комбинациям во второй: «лисица и гусь» и «гусь и кукуруза».
Таким образом, эта задача решается так же, как и задача с ли- сицей, гусем и кукурузой. Нам нужно передвинуть средний Кратцц
(гусь) в левый рецептор, после этого передвинуть влево верхний
Кратцц (лисица), удерживая при этом нажатой кнопку супрессора.
32 Глава 1
Далее мы начнем передвижение среднего Кратцца (гусь) обратно в правый рецептор. Затем мы перенесем нижний Кратцц (кукуруза) влево и, наконец, снова перенесем средний Кратцц (гусь) влево, от- крыв замок.
Вынесенные уроки
Главный урок здесь — это важность умения распознать аналогии.
В данном примере продемонстрировано, что проблема замка Квар- раси аналогична задаче с лисицей, гусем и кукурузой. Если мы смо- жем как можно раньше распознать аналогию, то сможем и избежать значительной части работы, просто взяв решение первой задачи, вместо создания нового. Большинство случаев сходства в решении задач не будут столь же прямыми, но по мере применения вы будете замечать это чаще и чаще.
Если вам было сложно увидеть связь между этой задачей и зада- чей с лисицей, гусем и кукурузой, это лишь потому, что я специаль- но включил настолько большое количество пространных деталей, насколько это было возможно. История, включенная в постановку задачи Кварраси, не имеет отношения к ее решению, точно также все наименования инопланетных технологий нужны для увеличения чувства нахождения в незнакомой обстановке. Более того, механизм с четным/нечетным количеством брусков делает задачу на первый взгляд более сложной, чем она есть. Если вы посмотрите на положе- ние Квиникрис, то вы увидите, что верхний Кратцц противополо- жен нижнему, поэтому они не могут взаимодействовать в сигнальной системе. Однако средний Кратцц взаимодействует с оставшимися двумя Кратццами.
Повторимся, если вы не разглядели аналогию, не переживайте.
Вы начнете распознавать их эффективнее, если будете знать об их существовании.
Общие подходы к решению задач
Приведенные выше примеры демонстрируют множество важных подходов, применяемых при решении задач. В оставшейся части книги вы будете изучать конкретные проблемы программирования и искать способы их решения, но для начала нужно составить общий список подходов и методов. Как вы убедитесь позднее, в некоторых областях существуют специфические подходы, но правила ниже мо- гут применяться практически в любой ситуации. Если вы сделаете их неотъемлемой частью вашего подхода к решению задач, ни одна проблема не поставит вас в тупик.
Планируйте решения
Это, вероятно, самое важное правило. У вас всегда должен быть план. Не стоит заниматься бессмысленной деятельностью.
Стратегии решения задач 33
К этому моменту вы, должно быть, поняли, что всегда можно со- ставить план. Правда в том, что если вы не решили задачу мыслен- но, то у вас не может быть плана по реализации решения в виде про- граммного кода. Это придет позже. Однако даже в самом начале у вас должен быть план, как вы будете искать решение.
Честно говоря, по ходу решения той или иной задачи план мо- жет потребоваться изменить или вообще отказаться от него в поль- зу нового плана. Тогда почему же это правило так важно? Генерал
Дуайт Эйзенхауэр известен своей фразой: «Я всегда убеждался, что планы бесполезны, но без планирования не обойтись». Он имел в виду, что сражения настолько хаотичны, что невозможно предска- зать все, что может произойти, или иметь вариант для любой ситуа- ции. В этом смысле планы бесполезны на поле сражения (известная фраза прусского полководца Гельмута фон Мольтке гласит: «Ни один план не выживает после первого контакта с врагом»). Но никакая армия не может одержать победу без планирования и организации.
Благодаря планированию генерал узнает возможности армии, как взаимодействуют различные армейские подразделения и так далее.
Точно так же у вас всегда должен быть план решения задачи. Он может и не выжить после первого контакта с врагом, вы можете от- казаться от него, как только начнете писать код в редакторе, но план у вас быть должен.
Без плана вы просто хватаетесь за соломинку в надежде пре- успеть, но ваши шансы на удачу близки к шансам обезьянки напи- сать пьесу Шекспира, беспорядочно нажимая клавиши на клавиа- туре. Счастливые случайности редки, а если такая случайность все же происходит, то ей все равно потребуется план. Многие слыша- ли историю о том, как был открыт пенициллин: исследователь по имени Александр Флеминг забыл прикрыть на ночь чашку Петри, используемую для культивирования бактерий, а на утро обнаружил, что плесень замедлила рост бактерий в чашке. Однако Флеминг не сидел в праздном ожидании счастливой случайности, он ставил экс- перименты, делал это тщательным и контролируемым образом и поэтому смог распознать важность того, что увидел в чашке Петри.
Должен заметить: если бы я обнаружил плесень на чем-то, что оста- вил неприкрытым на ночь, это явно не привело бы к важному науч- ному открытию.
Планирование также позволяет вам устанавливать промежуточ- ные цели и достигать их. Без плана у вас лишь одна цель: решить задачу. И до того, как вы решите эту задачу, вы не будете чувство- вать, что достигли чего-то. Возможно, как вы уже убедились на сво- ем опыте, программы редко делают что-то полезное, пока не будут близки к завершению процесса создания. Таким образом, работа на достижение только основной цели неизбежно ведет к разочарова- нию, и вы не получите удовлетворения до тех пор, пока не дойдете до конца. Однако если вместо этого вы создадите план, в котором
34 Глава 1
установите несколько последовательных меньших целей, даже если некоторые из них кажутся напрямую не связанными с основной це- лью, вы все равно будете измеримо продвигаться к решению задачи и чувствовать, что потратили время не зря. По окончании каждой рабочей сессии вы сможете проверить элементы плана и обрести уверенность, что сможете решить задачу, а не получить еще больше разочарований.
Переформулируйте задачи
Как показал пример задачи с лисицей, гусем и кукурузой, переформу- лирование условий может привести к ценным результатам. В неко- торых случаях задача, которая выглядит сложной, может оказаться очень простой при иной постановке или при использовании других определений. Переформулирование задачи похоже на то, как вы об- ходите гору, перед тем как взойти на нее. Прежде чем начать подъ- ем, почему бы не рассмотреть склон со всех сторон в поиске самого легкого пути к вершине?
Переформулирование иногда показывает, что цель — это совсем не то, что мы изначально предполагали. Однажды я прочитал исто- рию про бабушку, которая следила за внучкой, занимаясь при этом вя- занием. Чтобы успеть довязать, бабушка посадила внучку в перенос- ной манеж, но ребенку не нравилось сидеть в манеже, и девочка все время плакала. Бабушка перепробовала все возможные игрушки, что- бы сделать времяпрепровождение в манеже веселым, пока не поняла, что посадить ребенка в манеж было ошибкой изначально. Цель состо- яла в том, чтобы бабушка могла вязать в тишине. Решение: дать ре- бенку спокойно играть на ковре, пока бабушка вяжет, сидя в манеже.
Переформулирование задачи — это мощный прием, но многие про- граммисты не пользуются им, так как он не подразумевает непосред- ственно написание кода или хотя бы разработку решения. Это еще одна причина, почему просто необходимо иметь план. Без плана ваша единственная цель — получить работающий код, а переформулирова- ние задачи отводит вас дальше от написания кода. Имея план, вы мо- жете сделать «формальную переустановку задачи» первым пунк том.
Даже если переформулирование не приводит к очевидному ноу- хау, оно все равно может быть полезным. Например, если ваш босс или преподаватель поставил вам задачу, вы можете показать пере- фразированную версию человеку, который вам ее поставил, чтобы убедиться в правильном понимании проблемы. Кроме того, пере- формулирование задачи может быть необходимым предваритель- ным шагом при использовании других общих техник, таких как уменьшение и разделение задачи.
В более широком смысле переформулирование может транс- формировать все проблемные участки. Так, техника, которую я ис- пользую для рекурсивных решений и которой поделюсь в одной из глав, представляет собой метод переформулирования рекурсивных
Стратегии решения задач
1 2 3 4 5 6 7 8 9 ... 34