Модераторы: Alx, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача "Змейка" 
:(
    Опции темы
MItornaDOS
Дата 26.10.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.8.2007
Где: UA

Репутация: нет
Всего: нет



Цитата

На прямоугольном поле размера M x N, некоторые клетки которого вырезаны, необходимо разместить змейку длины L. Змейка есть последовательностью из L частей размера 1 x 1, каждая з которых занимает одну невырезанную клетку поля, каждые две последовательные части змейки должны размещаться в соседних клетках, и змейка не должна самопересикаться  (тесть в одной клетке не должно быть размещено две чати змейки) и ни одна с частей не может занимать вырезанную клетку. Говорят, что в некоторой клетке змейка имеет изгиб, если предыдущая часть змейки находилась в соседней клетке по горизонтале, а следующая в соседней по вертикали, или наоборот. Напишите программу Snake для размещения змейки так, чтобы она имела как можно меньше изгибов.

В первом рядке входного файлу Snake.dat записано 3 целых числа M, N, L (1≤ M ≤20, 1≤  N ≤ 20, 1≤  L ≤ 20). В следующих M рядах записаны по N чисел, каждое из которых может равнятся 0 или 1 и означает клетку поля: 0 – клетка свободна, 1 – клетка выколота.
В первом рядке исходного файла Snake.sol должно быть выведено минимально возможное число выгинов для размещения змейки длины L, если змейку можно разместить, либо значение  -1, если этого сделать невозможно. Если возможно, то в следующих L рядахнеобходимо вывести координаты (рядок и столбик) клеток, которые занимают части змейки. В каждом рядке должны быть координаты одной клетки, а последовательность рядков должна отвечать последовательности частей змейки.

Вот такая вот задачкаsmile
Собсно хотелось бы услышать способы подхода к задаче, а не тупо решение
Я хочу черпнуть с неё знаний

Добавлено через 7 минут и 25 секунд
Забыл примеры ещё

snake.dat
Код

4 5 10
1 0 1 0 1
0 0 0 0 0
0 1 0 1 0
0 0 0 1 1


snake.sol
Код

3
2 5
2 4
2 3
2 2
2 1
3 1
4 1
4 2
4 3
3 3



snake.dat
Код

4 6 2
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0

snake.sol
Код

-1

PM MAIL ICQ   Вверх
maxdiver
Дата 30.11.2008, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 2
Всего: 18



Ну построим из пустых клеток граф, рёбра в котором будем проводить между соседними клетками. В этом графе нам требуется найти простой незамкнутый путь длины L. Ясно, что эта задача эквивалентна задача о нахождении длиннейшего пути в неориентированном графе, которая для произвольных является NP-полной. Можно предположить, что и в случае нашего графа эта задача будет NP-полной (ограничения на задачу 20 подсказывают это).
Поэтому я бы написал простой перебор - перебираем начальную клетку, и пытаемся строить из неё путь длины L. В таком виде чистая асимптотика будет порядка 400 * 3^20, но, конечно, обычно переборы с отсечениями отрабатывают быстрее. В качестве дополнительного полезного отсечения я бы написал проверку, что из выбранной в качестве стартовой клетки достижимы хотя бы L-1 вершина.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.