Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

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

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

26.07.2013, 15:59. Просмотров 1781. Ответов 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
#   * #
#   $ #
#     #
#######
по идее чтоб решить эту задачу нужно знать волновой алгоритм(хотя думаю с ним просто по времени не впищемся) и все делать пошагово. У кого-то есть еще какие-то идеи как ее решать?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 15:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача "Сокобан" (C++):

Даны три слова - "мама", "мыла", "раму". Задача - напечатать всевозможные варианты построения слов - C++
Я записал код, однако эту часть надо автоматизировать, поможете? КОД: } #include <iostream> using namespace std; int main()...

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

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

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

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

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Wolkodav
603 / 456 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
26.07.2013, 16:09 #2
Есть такой алгоритм A*, почитай, может поможет как-нибудь.

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

Добавлено через 2 минуты
Хотя его еще придётся модернизировать как-нибудь...
это и есть волновой алгоритм, тут скорее всего нужно использовать Алгоритм поиска пути Jump Point Search.
интересно вообще кто-то из форума пытался ее решить?
З.Ы. задача висит в топе сложнейших на acm.timus.ru
Evg
Эксперт CАвтор FAQ
17636 / 5860 / 378
Регистрация: 30.03.2009
Сообщений: 16,166
Записей в блоге: 26
26.07.2013, 17:39 #4
Цитата Сообщение от name? Посмотреть сообщение
интересно вообще кто-то из форума пытался ее решить?
Бугога...
Несколько небольших игрушек

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

Добавлено через 2 минуты
Правда у меня было решение методом перебора (но такие маленькие уровни решались быстро). При этом глубину перебора нужно было задавать параметром. Т.е. если задача решаема за 10 ходов, а задано ограничение в 20 ходов, то программа найдёт решение, которое не более 20 ходов, и решение будет НЕ кратчайшим
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
26.07.2013, 17:52 #5
Evg, если бы можно сделать перебором, то эта задача не висела бы в топе сложнейших. Для поля 8*8 можно соорудить решение больше чем за 10 ходов, которые уже не отпереборит твоя программа. И тут, увы, TLE
Evg
Эксперт CАвтор FAQ
17636 / 5860 / 378
Регистрация: 30.03.2009
Сообщений: 16,166
Записей в блоге: 26
26.07.2013, 18:00 #6
Я и не говорю, что у меня идеальная программа и решает всё. Мне нужно было разрулить уровень 8 на 8, который мозгами я пройти не смог. Написал программу, она нашла решение, после чего я успокоился
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
26.07.2013, 18:50  [ТС] #7
Цитата Сообщение от Evg Посмотреть сообщение
Бугога...
Несколько небольших игрушек

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

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

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

Цитата Сообщение от name? Посмотреть сообщение
то проверь пройдет ли все тесты на АСМ твоя программа
Это что такое?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
26.07.2013, 20:08 #9
Цитата Сообщение от name? Посмотреть сообщение
З.Ы. задача висит в топе сложнейших на acm.timus.ru
какой смысл переписывать задачи с одного сайта на другой? Кто заинтересуется этой проблемой пойдёт на acm.timus.ru и решит её там!
Evg
Эксперт CАвтор FAQ
17636 / 5860 / 378
Регистрация: 30.03.2009
Сообщений: 16,166
Записей в блоге: 26
26.07.2013, 23:46 #10
Блин... я что-то подумал, что "АСМ" - это ассемблер...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 23:46
Привет! Вот еще темы с ответами:

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

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

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...

Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" - C++
Функция - расчёт зарплаты по нагрузке и оплате часа для определенной категории. Категория Оплата часа Вторая 150 Первая 200 ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.07.2013, 23:46
Ответ Создать тему
Опции темы

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