![]() |
|
|
![]()
|
|
| Flynn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 21.10.2006 Репутация: нет Всего: нет |
Дописываю программу написанную другим "программистом". Причем для этого программиста было явной тайно существование классов и шаблонов, уже задолбался разбираться с бесконечными массивами и переменными судя по названию которых их назначение известно только одному автору.
Но собственно сейчас проблема в том, что сейчас застрял на одной функции. Суть ее состоит вот в чем: Есть матрица, где первым значением каждой строки является ID элемента, вторым - число связей этого элемента с остальными элементами (элементами чегото вроде сети состоящей из элементов и связей между этими элементами), ну а дальше собственно идет непосредственно ID самих связей по которым непосредственно и определяется, что с чем связано. И задано первый и последний элемент сети, ну и нужно найти все возможные варианты "пути" от первого до последнего и занести их все в другой массив. И я собственно застрял на том, как найти все возможные эти пути, проблема состоит в том что просчитать один без проблем, но из каждого элемента может быть 1 или более связей с какимто другим(и) элементами т.е. количество возможностей может возрасти с каждым новым элементом на пути от первого до последнего и как все это просчитать не пойму. Уже просто мозг отказывает, и так переписал по новой примерно 800 строк кода, а эту функцию ох как не хочется заново переделывать, хотел просто дописать недостающий кусок кода но уперся в стену |
|||
|
||||
| ABW |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.6.2006 Репутация: нет Всего: нет |
А может оказаться такая ситуация, что элементы связаны по кругу, т.е. число возможных вариантов пути бесконечно? (если есть хотя бы 1 цикл, решений будет бесконечность)
А так делается это при помощи рекурсии. Кстати даже если бы это был класс, то без рекурсии тоже никак. Всё же не поще свой класс написать? Это сообщение отредактировал(а) ABW - 11.12.2006, 00:13 |
|||
|
||||
| Flynn |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 21.10.2006 Репутация: нет Всего: нет |
Нет такова быть неможет.
Чтобы всю эту помойку внести в класс нужно переписывать уйму кода т.к. стиль написания поражает, а попытки использования полиморфизма показали, что проще переписать всю программу с нуля. Меня просто вгоняет в тоску эта функция. О рекурсии я подумал уже, но суть в том, что там неизвестно вообще сколько раз будет вызываться данная функция, причем необходимо сделать так, чтобы каждый раз прощитывались разные варианты пути, которые могут имет отличия в любом месте. Это сообщение отредактировал(а) Flynn - 11.12.2006, 00:24 |
||||
|
|||||
| ABW |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.6.2006 Репутация: нет Всего: нет |
Поищи в инете что такое рекурсия, если будут вопросы - то пиши.
(Рекурсия - это когда функция вызывает сама себя.) Тебе надо получить, фактически, массив строк ,в каждой из которых находится список пройденных точек? Это сообщение отредактировал(а) ABW - 11.12.2006, 00:26 |
|||
|
||||
| Flynn |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 21.10.2006 Репутация: нет Всего: нет |
Да. Именно это мне и нужно сделать. |
|||
|
||||
| Bima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 15.8.2006 Репутация: 2 Всего: 2 |
Напиши исходные данные здесь. Какой начальный массив, какой конечный, для примера что на выходе должны иметь и как заполняется исходный массив. Чем подробнее напишь, тем легче будет реализация
-------------------- Чтобы дойти до цели, надо идти. Клавиатура и мышь - это главные инструменты прогресса. |
|||
|
||||
| ABW |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.6.2006 Репутация: нет Всего: нет |
||||
|
||||
| pandrew |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 27.3.2006 Репутация: 3 Всего: 3 |
Судя по твоему описанию, твой предшественник описал с помощью матрицы (массива, списка) (не)ориентированный граф и стоит задача вывести все возможные пути из одной вершины в другую. Алгоритм решения (разные варианты) можно взять из книжки "алгоритмы на графах". Дабы адаптировать твою "матрицу" к книжному алгоритму возможно потребуется завести класс-адаптер, т.е. класс вмещающий "матрицу" и предоставляющий методы доступа к вершинам, ребрам графа и отметки о прохождении. |
|||
|
||||
| ABW |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 5.6.2006 Репутация: нет Всего: нет |
А по-моему нужна коротенькая рекурсивная функция и одна глобальная переменная типа AnsiString. И всё. Проблема будет решена.
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Одной глобальной нельзя - надо найти ВСЕ пути от одного узла к другому - по сути типа сетевой задачи.
Функция может быть типа такой: bool IsLink(Point1, Point2) Должна возвращать истину, если между узлом Point1 и узлом Point2 есть путь. Соответственно внутри она берет все узлы, на которые у нее есть связи и каждый по очереди проверяет при помощи рекурсии... А в головной функции берем исходный узел, конечный узел, и для всех узлов, прикрепленных к исходному вызываем енто чудо... - если путь есть, добавляем орчередную строчку к результату. Недостатки - если есть круговая зависимость, то быстро вылетит с ошибкой. Преимущества - весьма быстро, дешево, сердито и кода минимум. Это так, общая идея, каким путем можно идти. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |