|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.10.2010, 17:36 | #1 |
Пользователь
Регистрация: 20.09.2010
Сообщений: 38
|
Есть ли решение?
Здравствуйте.
Заинтересовался я одной идеей. Наверняка многие слышали про игру Bubble Breaker. Там нужно цветные шарики убирать и очки набирать. Причем многие ошибочно пытаются убрать все шарики с поля, хотя смысл игры в том, чтобы вырастить максимально длинную цепочку шариков одного цвета и получить за это максимум возможных очков. Так вот, алгоритм самой игры особых сложностей не представляет. А возможен ли поиск оптимального решения? Порылся в интернете и ничего подобного не смог найти. Хотя изначально собирался сам состряпать,.. но подумал, а может уже есть протореная дорожка В итоге состряпал сам. Вроде все красиво, но мощностей не хватает у компа, чтобы просчитать поле размером 11х12 Алгоритм самый банальный: слева-направо, сверху вниз. Причем он работает, я убедился. Может мне кто-то сразу сможет сказать, что для того, чтобы просчитать подобную задачку методом прямого перебора всех возможных вариантов "В лоб", понадобится "....дцать миллионов лет машинного времени" или чего-нить подобное. Квадратик 6х7 считает достаточно шустро. Укладываюсь в 10 секунд (изначально было намного больше). Хотя многое зависит от стартового расположения шариков. И в некоторый момент времени программа как будто переходит порог.. и начинает работать значительно медленнее. Были у меня мысли по поводу того, что что-то кэшу не нравится. Но опыта в данном вопросе нет. Вот. Если кто-то заинтересовался и сможет помочь, с радостью предоставлю код для разборок. Он небольшой, 2-3 листика. Написано на масме, плоская модель памяти. Либо может есть идеи принципиально другого подхода к решению задачи. Можно даже в свободной форме изложить |
14.10.2010, 16:53 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
[OFFTOP]
предлагаю сделать конкурс программистов по разработке алгоритмов поиска решения. У кого он будет работать быстрее тот и выиграл. Если интересно, то пиши в личку, обмозгуем .... Последний раз редактировалось rpy3uH; 14.10.2010 в 16:58. |
14.10.2010, 21:02 | #3 |
Пользователь
Регистрация: 20.09.2010
Сообщений: 38
|
Да чего уж в личку, начну тут, может и другие втянутся
Возвращаюсь к своим баранам. Код разбит на процедуры, поэтому оптимизировать их достаточно удобно по отдельности. Для начала расскажу пару слов про свой алгоритм "решения" этой задачи. Выбирается первая попавшаяся группа шариков одного цвета. Если в группе шариков не менее двух (по одному нельзя убирать), то снимаем группу с поля, делаем сдвиг остальных шариков на освободившиеся места и идем дальше. До тех пор пока на поле есть еще хоть одна группа. Когда групп больше нет, возвращаемся на шаг назад, восстанавливаем удаленную группу, помечаем ее, и пытаемся найти другую группу шариков. Алгоритм рекурсивный. Подобным методом решают задачи по прохождению лабиринта. Заходят в первую попавшуюся комнату и если из нее есть проход дальше, то идут дальше, пока не упрутся в стену. Затем помечают комнату как пройденную и возвращаются на шаг назад. Все ходы в памяти сохранить не удастся, поэтому решил отвести буфер лишь для одной полной ветки "дерева" решений. В поле размером 11х12 максимальное теоретическое количество групп шариков равно 66 (11*12/2). После каждого хода количество групп на поле уменьшается, поэтому достаточно сохранять примерно 50 промежуточных состояний. Задача разбивается на 4 подзадачи. Основной цикл, в котором осуществляется переход по дереву решений, и три рабочих процедуры. Одна считает, сколько шариков в группе. Вторая - делает смещение шариков после хода. Третья - добавляет новый узел к дереву решений. Тут необходимо будет уточнить кое-какие тонкости, но это я сделаю позднее. Последняя процедура, судя по анализатору кода, получилась самой тяжелой. В следующем посте выложу код для разборок одной из процедур. Только пояснения добавлю. Последний раз редактировалось Vergo; 15.10.2010 в 14:49. |
14.10.2010, 22:06 | #4 |
Пользователь
Регистрация: 20.09.2010
Сообщений: 38
|
Код:
интерфейса ввода-вывода у программы на данный момент нет. На данном этапе и не надо. Стартовая позиция вбивается в область данных, результат можно посмотреть через отладчик. Главное сейчас - попытаться оптимизировать. А остальное дело техники. Код:
Последний раз редактировалось Vergo; 14.10.2010 в 23:06. |
14.10.2010, 22:18 | #5 |
Пользователь
Регистрация: 20.09.2010
Сообщений: 38
|
Код:
Она добавляет новый узел (делаем ход), удаляет помеченную на удаление группу и снимает пометки о проверке с других групп, поставленных на родительском узле. P.s.: Возможно вместо числовых значений тут стоит воспользоваться половинкой одного из регистров... Последний раз редактировалось Vergo; 15.10.2010 в 01:35. |
14.10.2010, 22:33 | #6 |
Пользователь
Регистрация: 20.09.2010
Сообщений: 38
|
Код:
Последний раз редактировалось Vergo; 14.10.2010 в 23:11. |
14.10.2010, 22:48 | #7 |
Пользователь
Регистрация: 20.09.2010
Сообщений: 38
|
Последняя процедура самая длинная по коду, но не по времени выполнения.
Состоит из двух частей. В первой части идет проверка на вертикальный сдвиг шариков (сверху вниз), во второй части - на горизонтальный (слева направо в кучку). Код:
Код:
Последний раз редактировалось Vergo; 15.10.2010 в 14:46. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
квадратное уравн(есть решение) | sllh_111 | Помощь студентам | 2 | 23.09.2010 17:06 |
запрос SQL . есть ли решение? | Tanuska___:) | БД в Delphi | 5 | 04.05.2010 12:09 |
Я-чайник (в excel) - у меня есть к Вам просьба, если есть желание и время - помогите. | rococococo | Microsoft Office Excel | 0 | 04.10.2009 12:16 |