Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите пожалуйста с задачей на рекурсию, нужно найти пары родственников 
:(
    Опции темы
Jime
Дата 23.6.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, помогите пожалуйста сделать задание на рекурсию. Ломаю голову над ней уже очень долго.

Задача:

Задано конечное множество имен жителей некоторого города, причем для каждого из жителей перечислены имена его детей. 
Жителей X и Y называются родственниками, если(а) либо X - ребенок Y, (б) либо Y - ребенок X, (в) либо существует некоторый Z, такой, что X является родственником Z, а Z является родственником Y. 
Перечислите все пары жителей города, которые являются родственниками.

___________________________

Задание нужно выполнить без использования массивов, структур.
Разрешено только посимвольное чтение из файла.

Пример входного файла:

маша(гриша, саша)
саша(ваня)
даша(маша)
костя(илья)
ваня(митя)


Выходной файл:

маша и гриша
маша и саша
гриша и саша
маша и ваня
гриша и ваня
саша и ваня
саша и митя
маша и митя
гриша и митя
и так далее

____________________

Помогите плз написать поиск строк, которые являются родственными.
Я буду очень благодарна.
PM MAIL   Вверх
zim22
Дата 23.6.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Jime @  23.6.2009,  20:57 Найти цитируемый пост)
Я буду очень благодарна.

вы уверены, что вам на С++ решение надо?
я помню давным давно реализовывал подобную задачу то ли на Lisp, то ли на Prolog


--------------------
PM MAIL   Вверх
Jime
Дата 24.6.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, нужно на с++.
PM MAIL   Вверх
zim22
Дата 24.6.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Jime @  24.6.2009,  09:52 Найти цитируемый пост)
да, нужно на с++.

вам нужно будет решить задачу связности. Connectivity problem.
удачи smile


--------------------
PM MAIL   Вверх
mes
Дата 24.6.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Jime @  23.6.2009,  19:57 Найти цитируемый пост)
Задание нужно выполнить без использования массивов, структур.

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



--------------------
PM MAIL WWW   Вверх
zim22
Дата 24.6.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(mes @  24.6.2009,  10:04 Найти цитируемый пост)
задача решается через построение графа(древа родственников), который без использования структур не представляем.

Вы в этом уверены? smile
я прекрасно помню, как решал аналогичную задачу используя массив. не структуру. массив правда был семантически равнозначен дереву. но не графу.



--------------------
PM MAIL   Вверх
mes
Дата 24.6.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(zim22 @  24.6.2009,  09:11 Найти цитируемый пост)
Вы в этом уверены? smile

Должна получиться вот такая динамическая структура :

Код

     даша                                  костя
       |                                    |
     маша                                  илья
    /   \ 
  гриша саша
         |
        ваня
         |
        митя

массивом тут и не пахнет smile 

Можно конечно хранить в массиве, а при обходе строить список родственной линии.
Разница будет в том, что при первом варианте сразу строится готовое древо, которая не будет иметь лишних затрат на обход, А во втором, для каждой пары родстванников вновь и вновь будет строится подходящая ветвь.


Это сообщение отредактировал(а) mes - 24.6.2009, 10:25


--------------------
PM MAIL WWW   Вверх
zim22
Дата 24.6.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(mes @  24.6.2009,  10:16 Найти цитируемый пост)
Должна получиться вот такая динамическая структура :

не обязательно.
можно сопоставить именам индексы массива.
было:
Код

маша(гриша, саша)
саша(ваня)
даша(маша)
костя(илья)
ваня(митя)

стало:
Код

1 (2, 3)
3 (4)
5 (1)
6 (7)
4 (8)

ну а дальше уже решить задачу свзяности. используя две абстрактные операции: объединение/поиск.

Это сообщение отредактировал(а) zim22 - 24.6.2009, 10:23


--------------------
PM MAIL   Вверх
mes
Дата 24.6.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(zim22 @  24.6.2009,  09:21 Найти цитируемый пост)

не обязательно.

Я разве утверждал что мое решение единственное?

Цитата(zim22 @  24.6.2009,  09:21 Найти цитируемый пост)
ну а дальше уже решить задачу свзяности.

А в результате то же самое древо. Только хранимое не как связанный список, а как массив связанных индексов.

И в том и в другом случае нарушается условие:
Цитата(Jime @  23.6.2009,  19:57 Найти цитируемый пост)
Задание нужно выполнить без использования массивов, структур.




--------------------
PM MAIL WWW   Вверх
zim22
Дата 24.6.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(mes @  24.6.2009,  10:16 Найти цитируемый пост)
 А во втором, для каждой пары родстванников вновь и вновь будет строится подходящая ветвь.

не строиться, а перестраиваться. и это будет делаться очень быстро.
Цитата

Для определения того, связаны ли два из N объектов, алгоритму взвешенного быстрого объединения требуется отследить максимум lgN указателей


Это сообщение отредактировал(а) zim22 - 24.6.2009, 10:34


--------------------
PM MAIL   Вверх
xvr
Дата 24.6.2009, 11:21 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Господа, вы не забыли, что топикстартеру нужно решить эту задачу через рекурсию?  smile 
2 Jime: какая то структура данных в любом случае понадобится. По крайней мере надо хранить исходный файл в удобном для обработке виде. Хотя можно и не хранить, а перечитывать его каждый раз  smile 

Главная функция - принимает 2 имени и выдает флаг - родственники они или нет
Код

bool is_relatives(string p1, string p2, int deep=0)
{
 if (is_parent(p1,p2) || is_parent(p2,p1)) return true;
 if (deep>1000) return false;
 forall Z in all names
  {
    if (is_relative(p1,Z,deep+1) && is_relative(Z,p2,deep+1)) return true;
  }
 return false;
}
Остается только вопрос - является ли человек родственником сам себе?


PM MAIL   Вверх
mes
Дата 24.6.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(xvr @  24.6.2009,  10:21 Найти цитируемый пост)
Остается только вопрос - является ли человек родственником сам себе?

нет, хотя бы потому, что "нельзя" составить пару :
Цитата(Jime @  23.6.2009,  19:57 Найти цитируемый пост)
Перечислите все пары жителей города, которые являются родственниками.


Цитата(xvr @  24.6.2009,  10:21 Найти цитируемый пост)
не забыли, что топикстартеру нужно решить эту задачу через рекурсию

а я и не видел  smile  спасибо, что обратили внимание smile


Это сообщение отредактировал(а) mes - 24.6.2009, 11:45


--------------------
PM MAIL WWW   Вверх
xvr
Дата 24.6.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(mes @ 24.6.2009,  11:44)
Цитата(xvr @  24.6.2009,  10:21 Найти цитируемый пост)
Остается только вопрос - является ли человек родственником сам себе?

нет, хотя бы потому, что "нельзя" составить пару :

Не факт, про 'пару жителей' тоже вопрос открытый - может ли эта 'пара' состоять из одного и того же человека в 2х экземплярах?  smile
Если это запретить, то в начало функции is_relatives надо добавить
Код

 if (p1==p2) return false;

PM MAIL   Вверх
Jime
Дата 24.6.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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