![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Vaz007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 13.5.2009 Где: Москва Репутация: нет Всего: нет |
Всем привет!
Нужно придумать алгоритм, которому не важен размер поля.Он должен вывести все возможные прохождения доски змейкой. Например: У нас есть: 1 2 3 4 5 6 7 8 9 А должно получиться: 1 2 3 6 5 4 7 8 9 а также 1 2 9 4 3 8 5 6 7 то есть пронумерованы шаги на доске. Таких комбинаций будет несколько. Нужно показать все правильные. Помогите пожалуйста. Это сообщение отредактировал(а) Vaz007 - 6.11.2009, 15:02 |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
Алгоритм тут только один - перебор всех возможных вариантов, с отбрасыванием заведомо ложных вариантов (это когда есть повторы или змейка заходит в тупик). Нужно создать цикл, количество итераций которого соответствует количеству перестановок (в данном случае 9! = 362880). В этом цикле составлять цепочки прохождений и смотреть выполняет ли такая цепочка вышеозначенные условия, если выполняет, то сохраняешь её или выводишь на экран. Алгоритм простой, но довольно долгий - время выполнения экспоненциально возрастает в зависимости от размера поля. зы: дай угадаю - эта тема в разделе С++ потому, что тебе нужен код именно на этом языке? Этой теме самое место в "алгоритмах". |
|||
|
||||
| 17dufa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Vaz007, предлагаю несколько другой вариант: общая идея как при обходе дерева в глубину. начиная с произвольной клетки и в качестве потомков рассматривая непосещенные соседние клетки. если потомков нет, то проверять - остались ли непосещенные клетки, если не осталось - то текущий проход это один из искомых вариантов. если непонятно, то на днях кусок кода брошу.
собстна вот кусок кода:
Это сообщение отредактировал(а) 17dufa - 6.11.2009, 18:03 |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
17dufa, тот же самый метод перебора
|
|||
|
||||
| 17dufa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
UniBomb, ясен перец это тож полный перебор. только не надо моск ломать над отсечением невозможных вариантов и генерацией всех перестановок. оно типа само и сгенерит и отсечет
|
|||
|
||||
| Vaz007 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 13.5.2009 Где: Москва Репутация: нет Всего: нет |
Спасибо буду пробовать
Добавлено через 14 минут и 51 секунду 17dufa Можешь пояснить про матрицу :
|
|||
|
||||
| 17dufa |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Vaz007, вообще факир был пьян и фокус не удался.
вот это место
неправильно вот с этим
это нечто такое должно получится
хотя слышал что такое создание динамического двойного массива не есть гуд, но что есть гуд не понял. и еще: этот метод вполне можно сделать шаблонным. что-то вроде template <T> T** CreateMatrix(int,int,T); |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |