Показать сообщение отдельно
  #2 (permalink)  
Старый 04.08.2013, 05:04
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

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

// Конструктор человека
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
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием