Ох, не программист я, не знаю хитрых алгоритмов, но вот что у меня получилось:
// Конструктор человека
var Person = function (name) {
var self = this;
this.name = name;
this.friends = {};
this.AddFriends = function () {
var max = arguments.length, man;
while (max--) {
man = arguments[max]; // Мой друг
self.friends[man.name] = man; // Моя связь с другом
man.friends[self.name] = self; // Связь друга со мной
}
};
};
// Создаём людей
var Kevin = new Person('Kevin');
var Joelle = new Person('Joelle');
var Noah = new Person('Noah');
var Matteo = new Person('Matteo');
var Stephanie = new Person('Stephanie');
var Lucas = new Person('Lucas');
var Roger = new Person('Roger');
var Mathilde = new Person('Mathilde');
var Sophie = new Person('Sophie');
var Aaron = new Person('Aaron');
var Sarah = new Person('Sarah');
var Bob = new Person('Bob');
var Louis = new Person('Louis');
var Pascal = new Person('Pascal');
var Julie = new Person('Julie');
var Orianne = new Person('Orianne');
// Дружим людей
Kevin.AddFriends(Mathilde, Sophie, Aaron, Sarah);
Joelle.AddFriends(Sarah, Bob, Aaron, Louis);
Noah.AddFriends(Pascal, Julie, Mathilde);
Matteo.AddFriends(Sophie, Aaron);
Stephanie.AddFriends(Bob, Orianne);
Lucas.AddFriends(Aaron, Louis);
Roger.AddFriends(Julie);
Sophie.AddFriends(Julie);
Orianne.AddFriends(Mathilde);
// Функция проверяющая дружбу
var isFriend = function (person1, person2) {
var viewedPerson = {};
var chainFriends = [];
console.log('Ищем связь между "' + person2.name + '" и "' + person1.name + '".');
function searchFriens(person) {
var friend;
viewedPerson[person.name] = true; // Запоминаем что смотрели друзей этого человека
chainFriends.push(person.name); // Добавим чела в цепочку связей
// Пройдёмся по корешам
for (var name in person.friends) {
friend = person.friends[name];
// Если чел не является сам собой, нужным нам челом и раньше не исследовался
if (friend !== person1 && friend !== person2 && viewedPerson[friend.name] === undefined) {
searchFriens(friend); // Рекурсивный вызов
} else if (friend === person1) {
// Ура, это то что нам нужно
console.log(chainFriends.join(' -> ') + ' -> ' + person1.name);
}
}
chainFriends.slice(chainFriends.length - 1, 1); // Удалим чела из цепочки
}
searchFriens(person2);
};
// Найдём связь для "Kevin" и "Pascal"
isFriend(Kevin, Pascal);
В консоли получаю такое
Код:
|
Ищем связь между "Pascal" и "Kevin".
Pascal -> Noah -> Mathilde -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Matteo -> Sophie -> Kevin
Pascal -> Noah -> Mathilde -> Orianne -> Stephanie -> Bob -> Joelle -> Louis -> Lucas -> Aaron -> Matteo -> Sophie -> Julie -> Roger -> Sarah -> Kevin |