Проект Euler # 163 понимание - PullRequest
17 голосов
/ 14 мая 2010

Я потратил довольно много времени на поиск решения этой проблемы . Я нарисовал тонны заштрихованных треугольников, сосчитал треугольники в простых случаях и искал какой-то шаблон. К сожалению, я врезался в стену. Я почти уверен, что мои навыки программирования / математики не соответствовали требованиям для этой проблемы.

Итак, я нашел решение онлайн, чтобы получить доступ к форумам. Я совсем не понимал большинство методов, а некоторые просто казались слишком сложными.

Может кто-нибудь дать мне понимание этой проблемы? Один из методов, найденных здесь: http://www.math.uni -bielefeld.de / ~ sillke / SEQUENCES / grid-triangles (Задача C) разрешено использовать одну функцию

Как они пришли к такому решению? На данный момент, я действительно хотел бы понять некоторые концепции этой интересной проблемы. Я знаю, что поиск решения не был частью духа Эйлера, но я уверен, что я бы так или иначе не решил эту проблему.

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

Это, по сути, проблема в перечислительной комбинаторике, которая является искусством подсчета комбинаций вещей. Это красивый предмет, но, вероятно, нужно немного разогреться, прежде чем вы сможете оценить трюки ниндзя в приведенной вами ссылке.

С другой стороны, комментарии в ветке решений этой проблемы указывают на то, что многие решили проблему, используя метод грубой силы. Один из наиболее распространенных приемов заключается в том, чтобы взять все возможные комбинации трех линий на диаграмме и выяснить, дают ли они треугольник, который находится внутри самого большого треугольника.

Вы можете значительно сократить пространство поиска, заметив, что линии расположены в одном из шести направлений. Поскольку комбинация линий, включающая две параллельные линии, не приведет к треугольнику, вы можете перебирать тройки строк, чтобы каждая линия в тройке имела различное направление.

Учитывая три линии, вычислите их точки пересечения. У вас будет три возможности 1) линии совпадают - все они пересекаются в общей точке 2) две линии пересекаются в точке за пределами треугольника 3) все три точки пересечения различны, и все они находятся внутри внешнего треугольника

Просто посчитайте комбинации, удовлетворяющие условию (3), и все готово. Количество комбинаций линий, которые вы должны протестировать, равно O (n 3 ), что не является запретительным.

РЕДАКТИРОВАТЬ1: перечитывая ваш вопрос, у меня сложилось впечатление, что вы могли бы быть более заинтересованы в объяснении комбинаторического решения / формулы, чем в общих чертах. Если это так, скажите, и я удалю этот ответ. Но я бы также сказал, что вопрос в этом случае не подходит для этого сайта.

EDIT2: См. Также комбинаторное решение Билла Дейли и других . Математически он немного мягче, чем другой.

0 голосов
/ 14 мая 2010

Я не решил эту проблему для Project Euler и ухожу от вопроса и решения, которое вы предоставили. В случае единственной функции, представленная методология была в конечном счете простым поиском образца. Решатель разбил представленный вопрос на три части, основываясь на типах треугольников, которые присутствовали на перекрестках. Это довольно стандартный подход к такой проблеме: разбить большую модель на более мелкую, чтобы облегчить решение. Функции, используемые для выражения различных форм треугольников, которые я могу только предположить, были сгенерированы либо с очень острым умом нахождения паттернов, либо с некоторой теорией / геометрией чисел. Это также выходит за рамки этого объяснения и моих знаний. Эта проблема не имеет ничего общего с программированием. Это в основном полностью математика. Если вы прочитали сайт, который вам понравился, вы можете увидеть логику, которая прошла через вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...