
class Person
{
	public String name;
	public Person enemy;
	public Person friend;

	public Person(String name)
	{
		this.name = name;
	}

	public void makeEnemy(Person enemy)
	{
		this.enemy = enemy;
	}

	public boolean hasFriend()
	{
		return (friend != null);
	}

	public void seekFriendByAssociation()
	{
		// seek a friend only if I have none so far
		if (!hasFriend() && haveFriendByAssociation())
		{
			friend = enemy.enemy;
			// and do the reflexive property, if my enemy's enemy has no friends
			// must be careful since the friend's friend might have a different enemy
			// than the one represented by "this" one
			if (! enemy.enemy.hasFriend() && ! enemy.enemy.haveFriendByAssociation())
			{
				enemy.enemy.friend = this;
			}
		}
	}

	public boolean haveFriendByAssociation()
	{
		return (enemy != null && enemy.enemy != null);
	}

	public String toString()
	{
		if (friend == null)
		{
			return name + " has no friends...sad but true";
		}
		else
		{
			return name + " has " + friend.name + " as friend";
		}
	}
}

public class TestBootcamp
{
	public static void main(String[] args)
	{

		int noOfPlayers = 5;

		Person tennisPlayers[] = new Person[noOfPlayers];

		tennisPlayers[0] = new Person("Roger Federer");
		tennisPlayers[1] = new Person("Andy Roddick");
		tennisPlayers[2] = new Person("Juan Carlos Ferrerro");
		tennisPlayers[3] = new Person("Guilermo Coria");
		tennisPlayers[4] = new Person("David Nalbandian");

		tennisPlayers[0].makeEnemy(tennisPlayers[1]);
		tennisPlayers[1].makeEnemy(tennisPlayers[3]);
		tennisPlayers[3].makeEnemy(tennisPlayers[2]);
		tennisPlayers[2].makeEnemy(tennisPlayers[4]);

		for (int i = 0; i < noOfPlayers; i++)
		{
			tennisPlayers[i].seekFriendByAssociation();
			System.out.println(tennisPlayers[i]);
		}
	}
}
