Вы могли бы реализовать своего рода тройной цикл здесь;алгоритм может быть следующим:
- Первый цикл: найти все классы, у которых есть друзья, и запомнить имя друга и имя фактического класса;
- Затем выполнить внутреннийвыполните цикл для всех классов и найдите класс с именем друга из шага 1.
- Затем выполните другой внутренний цикл для всех друзей класса, найденных на шаге 2. Если вы нашли класс с именем изшаг 1 - вуаля - они общие друзья.
Я считаю, что Perl и регулярные выражения - лучшие инструменты для таких вещей.
PS уверен, что этот подход имеет свои пределы, потому что не всев C ++ можно было разобрать с помощью регулярных выражений (using namespace
вещи - это первое, что пришло мне в голову).Но, в некоторой степени, это рабочий подход, и если у вас нет альтернатив, вы можете попробовать.
EDIT:
Идея пришла мне в голову сегодня утром, пока я все ещележал в моей кровати.:) Идея довольно проста и понятна (как и все утренние идеи): используйте SQL!Естественно, представьте, что у вас есть таблица классов с 2 столбцами, где первый столбец - имя класса, а второй столбец - имя друга.Скажем, что-то вроде этого:
ClassName FriendName
C1 C2
C1 C3
C1 C4
C2 C1
C2 C8
C3 C1
C3 C2
... ...
Тогда вы можете выполнить простой запрос к нему.Скажем, что-то вроде этого (извините, у меня нет удобной базы данных SQL, поэтому я не проверил запрос, но я надеюсь, что вы поймете идею и реализуете ее по мере необходимости:
SELECT ClassName as c, FriendName as f FROM T
WHERE c in
(SELECT FriendName FROM T
WHERE FriendName = c AND ClassName = f)
Идея этого варианта заключается в том, что мы должны использовать те сборы, которые точно соответствуют задаче. Что может сравниться с SQL, когда вам нужно обработать некоторые наборы данных?