Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
name?
198 / 169 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
#1

Задача "Сокобан" - C++

26.07.2013, 15:59. Просмотров 1975. Ответов 9
Метки нет (Все метки)

Ограничение времени: 5.0 секунды
Ограничение памяти: 64 МБ
Программист Стас на время отпуска устроился поработать в японскую компьютерную фирму Thinking Rabbit. Сначала идея казалась замечательной — и на халяву съездить за границу, и заработать, и набраться опыта у японских коллег. Но оказалось, что программисты без знания японского фирме не нужны, и Стаса отправили работать кем-то вроде кладовщика (по-японски его профессию называли Soko-ban).
Стас должен наводить порядок на складе, точнее, расставлять контейнеры с грузом по местам. Каждое утро Стасу дают бумажку со схемой очередного помещения и указанием, куда надо поставить контейнеры (почему-то начальству фирмы Thinking Rabbit не важно, какой именно контейнер куда поставить, главное, чтобы все контейнеры стояли только на отмеченных местах).
Однако, расставить их не так просто. Контейнеры большие и тяжелые, так что передвигать их можно, только толкая по полу, причем сил хватает лишь на один контейнер за раз. Кстати, контейнеры еще и гладкие, поэтому их можно толкать перед собой, но невозможно, например, тянуть за собой или поворачивать. Габариты помещения точно подогнаны под размеры контейнеров, поэтому Стас не может перебраться через контейнер, протиснуться между стоящими рядом контейнерами или пролезть между контейнером и стеной — он может ходить только по свободному пространству. Поэтому наведение порядка превращается в жуткую головоломку. А если решить её не удается или контейнер случайно попадает в какой-нибудь угол, из которого его не вытащить, то Стасу не позавидуешь. Дело в том, что стены склада сплошные, без выходов. Утром Стас попадает на склад через один из люков в потолке, а выйти из помещения он может только тогда, когда выполнит свою задачу. Умная система управления откроет люк для Стаса в нужном месте.
Помогите Стасу составить план перемещения контейнеров.
Исходные данные
На входе задана схема склада — прямоугольная сетка размером n × m (3 ≤ n, m ≤ 8). Пустое место обозначется пробелом, а объекты обозначаются следующими символами:
# — стены
. — пустое место, куда нужно поставить контейнер (цель)
@ — место, откуда начинает работу Стас
+ — место, откуда начинает работу Стас, если там находится одна из целей
$ — контейнер на пустом месте
* — контейнер на одной из целей
Гарантируется, что схема склада задана корректно, т.е. Стас не может выйти за его пределы. Количество контейнеров совпадает с количеством целей.
Результат
Выведите строку, описывающую план перемещений Стаса, при котором он расставляет контейнеры по конечным позициям. Все перемещения записываются буквами r, l, u и d (соответствующие четырем направлениям перемещений). Если при перемещении двигается контейнер, то буквы записываются в верхнем регистре (R, L, U и D соответственно). Длина строки не должна превышать 10000 символов. Можете считать, что решение всегда существует.
Примеры
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
исходные данные результат
########
#@  $ .#                rrRR
########
 
 ######
##   .#
#@  ###              dddrrrruLdlUUUluRR
#   * #
#   $ #
#     #
#######
по идее чтоб решить эту задачу нужно знать волновой алгоритм(хотя думаю с ним просто по времени не впищемся) и все делать пошагово. У кого-то есть еще какие-то идеи как ее решать?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 15:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача "Сокобан" (C++):

Даны три слова - "мама", "мыла", "раму". Задача - напечатать всевозможные варианты построения слов
Я записал код, однако эту часть надо автоматизировать, поможете? КОД: }...

Необработанное исключение в "0x76f015de" в "контрольная 1 задача 2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x334e2c64"
доброго времени суток. Необработанное исключение в "0x76f015de" в "контрольная...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов),...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

Задача "замочная скважина" и "ключ" ошибка в коде
Почему-то не работает программа реализующая следующую задачу: Даны...

9
Wolkodav
609 / 462 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
26.07.2013, 16:09 #2
Есть такой алгоритм A*, почитай, может поможет как-нибудь.

Добавлено через 2 минуты
Хотя его еще придётся модернизировать как-нибудь...
0
name?
198 / 169 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
26.07.2013, 16:12  [ТС] #3
Цитата Сообщение от Wolkodav Посмотреть сообщение
Есть такой алгоритм A*, почитай, может поможет как-нибудь.

Добавлено через 2 минуты
Хотя его еще придётся модернизировать как-нибудь...
это и есть волновой алгоритм, тут скорее всего нужно использовать Алгоритм поиска пути Jump Point Search.
интересно вообще кто-то из форума пытался ее решить?
З.Ы. задача висит в топе сложнейших на acm.timus.ru
0
Evg
Эксперт CАвтор FAQ
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,445
Записей в блоге: 30
26.07.2013, 17:39 #4
Цитата Сообщение от name? Посмотреть сообщение
интересно вообще кто-то из форума пытался ее решить?
Бугога...
http://www.cyberforum.ru/graphics/thread93716-page5.html#post4865241

Цитата Сообщение от Evg Посмотреть сообщение
Кстати, поищи коллекцию под названием "yoshio autogenerated". Там такие же маленькие уровни, но с тремя камнями. Они поинтереснее. В своё время я очень конкретно засел на одном уровне, аж написал программу, которая решение ищет
Могу продать, если найду

Добавлено через 2 минуты
Правда у меня было решение методом перебора (но такие маленькие уровни решались быстро). При этом глубину перебора нужно было задавать параметром. Т.е. если задача решаема за 10 ходов, а задано ограничение в 20 ходов, то программа найдёт решение, которое не более 20 ходов, и решение будет НЕ кратчайшим
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
26.07.2013, 17:52 #5
Evg, если бы можно сделать перебором, то эта задача не висела бы в топе сложнейших. Для поля 8*8 можно соорудить решение больше чем за 10 ходов, которые уже не отпереборит твоя программа. И тут, увы, TLE
0
Evg
Эксперт CАвтор FAQ
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,445
Записей в блоге: 30
26.07.2013, 18:00 #6
Я и не говорю, что у меня идеальная программа и решает всё. Мне нужно было разрулить уровень 8 на 8, который мозгами я пройти не смог. Написал программу, она нашла решение, после чего я успокоился
0
name?
198 / 169 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
26.07.2013, 18:50  [ТС] #7
Цитата Сообщение от Evg Посмотреть сообщение
Бугога...
http://www.cyberforum.ru/graphics/thread93716-page5.html#post4865241

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

Цитата Сообщение от Evg Посмотреть сообщение
Могу продать, если найду

Добавлено через 2 минуты
Правда у меня было решение методом перебора (но такие маленькие уровни решались быстро). При этом глубину перебора нужно было задавать параметром. Т.е. если задача решаема за 10 ходов, а задано ограничение в 20 ходов, то программа найдёт решение, которое не более 20 ходов, и решение будет НЕ кратчайшим
Продавать не нужно) если найдешь, то проверь пройдет ли все тесты на АСМ твоя программа
0
Evg
Эксперт CАвтор FAQ
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,445
Записей в блоге: 30
26.07.2013, 19:43 #8
Цитата Сообщение от name? Посмотреть сообщение
Продавать не нужно
"Могу продать" - это собирательное выражение Не думаю, что кто-то согласится такую лажу купить

Цитата Сообщение от name? Посмотреть сообщение
то проверь пройдет ли все тесты на АСМ твоя программа
Это что такое?
0
Kuzia domovenok
2216 / 1985 / 447
Регистрация: 25.03.2012
Сообщений: 6,978
Записей в блоге: 1
26.07.2013, 20:08 #9
Цитата Сообщение от name? Посмотреть сообщение
З.Ы. задача висит в топе сложнейших на acm.timus.ru
какой смысл переписывать задачи с одного сайта на другой? Кто заинтересуется этой проблемой пойдёт на acm.timus.ru и решит её там!
1
Evg
Эксперт CАвтор FAQ
18940 / 6901 / 513
Регистрация: 30.03.2009
Сообщений: 19,445
Записей в блоге: 30
26.07.2013, 23:46 #10
Блин... я что-то подумал, что "АСМ" - это ассемблер...
0
26.07.2013, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 23:46
Привет! Вот еще темы с решениями:

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс"
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран...

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

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания"
Создать класс Книга поля: название книги,количество страниц,год издания...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата"
определить тип данных запись имеющий поля фамилия пол зарплата. определить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru