private static void Distribute(IDictionary<int, Person> people, Room room, int maxIterations) { var index = 0; var peopleByNumberFriends = people.Values.OrderBy(x => x.NumberOfFriends).ToArray(); var spotsByNumberNeighbours = room.OrderBy(x => x.Neighbours.Keys.Count).ToArray(); foreach (var spot in spotsByNumberNeighbours) { spot.Person = peopleByNumberFriends[index++]; } var iterations = 0; var changeMade = false; do { var awfulSpots = room.OrderBy(x => x.Score).ToList(); var spot1 = awfulSpots.First(); foreach (var spot2 in awfulSpots.Skip(1)) { var currentScore = spot1.Score + spot2.Score; var p1 = spot1.Person; var p2 = spot2.Person; spot1.Person = p2; spot2.Person = p1; if (spot1.Score + spot2.Score > currentScore) { changeMade = true; break; } // restore spot1.Person = p1; spot2.Person = p2; } iterations++; } while (changeMade && iterations < maxIterations); }