Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2009, 19:22   #1
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию Методы решения задач типа: ход конем

Собственно вопрос- как решать задачи подобного типа?
Цитата:
"На шахматной доске размером m*n клеток несколько клеток вырезано. Провести путь минимальной длины из одной заданной клетки в другую ХОДОМ КОНЯ через не вырезанные клетки"
Мой вариант решения такой: Решаем задачу с помощью теории графов. Представляем каждую клетку поля вершиной неориентированного графа. К одной вершине присоединяем только ту, в которою можно походить конем и если она- не вырезанная клетка.

Есть ли более экономичные/правильные варианты решения?
Levsha100 вне форума Ответить с цитированием
Старый 12.09.2009, 19:36   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Берем исходную клетку и ставим туда 0.
Потом во все доступные с одного хода клетки ставим 1. Дальше для каждой из этих клеток смотрим все доступные и ставим туда 2 (если еще ничего не стоит). И так пока все не заполним. В итоге имеем матрицу, в каждой ячейке которой стоит число - минимальное количество ходов, за которое к ней можно добраться.
Потом берем конечную клетку и от нее идем к начальной. Ну или еще во время заполнения смотреть, не попали ли в конечную клетку.
Как-то так. Называется, вроде, волновой алгоритм.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.09.2009, 19:45   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Блин, точно!
Протупил...)
Еще 400 примеров решу и займусь информой.
Sazary, спасибо!
// Кстати, тогда уже можно использовать "двойной" волновой алгоритм, т.е. "трассировать" путь из двух точек одновременно.
///Блин, я тупой, как не мог додуматься раньше...

Последний раз редактировалось Levsha100; 12.09.2009 в 19:53.
Levsha100 вне форума Ответить с цитированием
Старый 12.09.2009, 19:57   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию


Цитата:
Сообщение от Levsha100
// Кстати, тогда уже можно использовать "двойной" волновой алгоритм, т.е. "трассировать" путь из двух точек одновременно.
Мм.. Это как? Ведь изначально вы не знаете, сколько ходов до конечной точки.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.09.2009, 20:08   #5
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Эммм... над этим нужно подумать....
Я просто провел аналогию с волновым алгоритмом, тут, наверное, немного другое. Суть в том, что эффективность возрастает в несколько раз при "параллельном" поиске.
Опять, наверное, протупил Неа, после дня решения алгебры/геометрии мне категорически запрещается писать на форуме .
//Что то типа breadth-first vs bidirectional...

Последний раз редактировалось Levsha100; 12.09.2009 в 20:14.
Levsha100 вне форума Ответить с цитированием
Старый 12.09.2009, 20:26   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вообще, этот самый параллельный поиск будет эффективен только если будет осуществляться одновременно. То есть, придется смотреть в сторону многопоточности. Тогда обход от начала может ставить в ячейки положительные значения, а обход от конца - отрицательные. При встрече суммируем по модулю. Ну там еще подумать надо.
В общем, по-моему проще сделать по-обычному ))
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.09.2009, 20:41   #7
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Цитата:
будет эффективен только если будет осуществляться одновременно
Тут основная суть показываеться, если посмотреть на рисунок:
Хотя да легче сделать более простым способом.
Изображения
Тип файла: jpg cxem.jpg (14.7 Кб, 159 просмотров)
Levsha100 вне форума Ответить с цитированием
Старый 12.09.2009, 20:44   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А что за красная линия? И почему 3 окружности? )
Имел в виду, что если поиск будет выполняться последовательно, пусть даже попеременно из одной точки и из другой, то по скорости это все равно будет также, как и обычный поиск. Вот )

А картинка напоминает какую-то абстрактную композицию
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 12.09.2009, 21:05   #9
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Объясняю свой рисунок
Линия это разделитель, верху Ваш вариант, внизу- мой.
Красные точки- начало и финиш(или наоборот, значения не имеет)
Окружности ограничивают пройденные клетки массива.
В Вашем варианте одна окружность, потому что Вы ищете последвательно от
начала до конца. А в моем мы "проходим" клетки "одновременно".
Получается что при одинаковом количестве "ходов" мои окружности ближе друг к другу чем Ваша к финишной точке.
Воть.
Надеюсь Вы хоть что то поняли, ибо я слишком сумбурно объяснил...
Levsha100 вне форума Ответить с цитированием
Старый 12.09.2009, 21:16   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

В принципе, понял. И мнение не изменилось - в однопоточной программе выигрыша не будет. Да и потом не совсем ясно, как вы это будете реализовывать )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ход конем Etlau Помощь студентам 3 28.05.2010 19:16
Математические методы решения Golovastik Общие вопросы C/C++ 0 23.06.2009 17:28
помогите придумать ход решения Petruha-nsk Общие вопросы C/C++ 6 13.04.2009 18:31
Задача "Ход конем" WormsSs Общие вопросы C/C++ 14 29.11.2008 16:25
Требуются решения 2х задач. anna Помощь студентам 8 10.04.2007 20:01