В последнее время я играю в игру на своем iPhone под названием Scramble. Некоторые из вас могут знать эту игру как Boggle. По сути, когда игра начинается, вы получаете матрицу букв примерно так:
F X I E
A M L O
E W B X
A S T U
Цель игры - найти как можно больше слов, которые можно составить, объединив буквы. Вы можете начать с любой буквы, и все буквы, которые ее окружают, являются честной игрой, а затем, как только вы перейдете к следующей букве, все буквы, которые окружают эту букву, являются честной игрой, за исключением любых ранее использованных букв. Так, в приведенной выше таблице, например, я мог бы найти слова LOB
, TUX
, SEA
, FAME
и т.д. Слова должны содержать не менее 3 символов и не более NxN символов, что в этой игре будет 16, но может различаются в некоторых реализациях. Хотя эта игра веселая и затягивающая, я, видимо, не очень хорош в этом, и я хотел немного обмануть, создав программу, которая дала бы мне наилучшие слова (чем длиннее слово, тем больше очков вы получаете).
(источник: boggled.org)
Я, к сожалению, не очень хорош с алгоритмами или их эффективностью и так далее. Моя первая попытка использует словарь, такие как этот (~ 2.3MB) и делает линейный поиск пытается соответствовать комбинации с словарных статей. Это занимает очень много времени, чтобы найти возможные слова, и так как вы получаете только 2 минуты за раунд, это просто не подходит.
Мне интересно посмотреть, могут ли какие-либо Stackoverflowers предложить более эффективные решения. Я в основном ищу решения, использующие Big 3 Ps: Python, PHP и Perl, хотя что-нибудь с Java или C++ тоже круто, так как скорость важна.
ТЕКУЩИЕ РЕШЕНИЯ:
- Адам Розенфилд, Питон, ~ 20 лет
- Джон Фухи, Питон, ~ 3 с
- Кент Фредрик, Perl, ~ 1с
- Дариус Бэкон, Питон, ~ 1с
- rvarcher, VB.NET (прямая ссылка), ~ 1с
- Паоло Бергантино, PHP (прямая ссылка), ~ 5 с (~ 2 с локально)