//Beste groepjes van dieren maken en terug geven in een lijst van wagonnen
        public List <Wagon> Arrange(List <Animal> inputAnimals)
        {
            List <Wagon>  wagonsWhichCanBeFilled         = new List <Wagon>();                                                       //Lijst van wagons waar nog plek is
            List <Animal> smallHerbsWhichNeedToBePlaced  = new List <Animal>();
            List <Animal> mediumHerbsWhichNeedToBePlaced = new List <Animal>();
            List <Animal> largeHerbsWhichNeedToBePlaced  = new List <Animal>();
            List <Animal> animalsLeft = new List <Animal>();

            //1. Carnivoren mogen niet bij elkaar, dus geef deze allemaal een eigen wagon
            foreach (Animal animal in inputAnimals)
            {
                if (animal.Carnivore)
                {
                    Wagon w = new Wagon();
                    w.addAnimal(animal);

                    //Als het een grote carnivoor is mag de wagon gesloten worden, grote carnivoren eten alle andere dieren op.
                    if (animal.Size == AnimalSize.Large)
                    {
                        Wagons.Add(w);
                    }
                    else
                    {
                        wagonsWhichCanBeFilled.Add(w); //Wagons waar we nog dieren aan toekunnen voegen.
                    }
                }
                else //Dieren die nog een wagon moeten krijgen, worden in een lijst gezet om makkelijker te vullen
                {
                    switch (animal.Size)
                    {
                    case AnimalSize.Small:
                        smallHerbsWhichNeedToBePlaced.Add(animal);
                        break;

                    case AnimalSize.Medium:
                        mediumHerbsWhichNeedToBePlaced.Add(animal);
                        break;

                    default:                            //Alle overgebleven dieren zijn grote herbivoren
                        largeHerbsWhichNeedToBePlaced.Add(animal);
                        break;
                    }
                }
            }

            //2. Alle middel carnivoren mogen alleen een grote herbivoor bij zich
            if (largeHerbsWhichNeedToBePlaced.Count > 0)                                                                           //Kijken of er überhaupt grote carnivoren zijn
            {
                for (int i = 0; i < wagonsWhichCanBeFilled.Count; i++)                                                             //Kijke door alle wagonnen die al een carnivoor hebben
                {
                    Wagon w = wagonsWhichCanBeFilled[i];
                    if (w.animals.Contains(new Animal(true, AnimalSize.Medium)))                                                   //Als het een middel carnivoor is, mag de grote herbivoor toegevoegd worden
                    {
                        if (w.addAnimal(largeHerbsWhichNeedToBePlaced[0]))
                        {
                            largeHerbsWhichNeedToBePlaced.RemoveAt(0);                                                             //Het toegevoegde dier uit de lijst van dieren zonder wagon halen

                            Wagons.Add(w);
                            wagonsWhichCanBeFilled.RemoveAt(i);                                                                    //Hier kunnen geen dieren meer bij, middel carn(3) grote herb(5) = 3+5=8.
                                                                                                                                   //Er mogen geen kleine dieren bij worden opgegeten
                            if (largeHerbsWhichNeedToBePlaced.Count <= 0)                                                          //kijken of er nog grote herbivoren zijn anders stoppen, zonder dit kun je out of range krijgen
                            {
                                break;
                            }
                        }
                    }
                }
            }

            //3. Overgebleven dieren nog in een wagon doen
            animalsLeft.AddRange(smallHerbsWhichNeedToBePlaced);
            animalsLeft.AddRange(mediumHerbsWhichNeedToBePlaced);
            animalsLeft.AddRange(largeHerbsWhichNeedToBePlaced);
            List <Animal> animalsToAdd;

            while ((animalsLeft.Count) > 0)                                                                                         //Kijken of er dieren zijn
            {
                if (wagonsWhichCanBeFilled.Count <= 0)                                                                              //Kijken of er wagonnetjes zijn waar al dieren in zitten
                {
                    wagonsWhichCanBeFilled.Add(new Wagon());
                }

                //Kijken naar de best mogelijke combinatie om de wagon te vullen
                animalsToAdd = SortWagonWithCheckCombinations(wagonsWhichCanBeFilled[0], animalsLeft);

                //Plaats de dieren in de wagon
                for (int i = animalsToAdd.Count - 1; i >= 0; i--)
                {
                    if (wagonsWhichCanBeFilled[0].addAnimal(animalsToAdd[i]))
                    {
                        animalsLeft.RemoveAt(animalsLeft.IndexOf(animalsToAdd[i]));
                    }
                    animalsToAdd.RemoveAt(i);
                }

                //Verplaats de wagon naar de trein
                Wagons.Add(wagonsWhichCanBeFilled[0]);
                wagonsWhichCanBeFilled.RemoveAt(0);

                //Opschonen
                animalsToAdd.Clear();
            }

            //Als de animals eerder geplaatst zijn, dan dat alle wagons gevuld zijn:
            //Voeg alle wagons toe aan de trein
            Wagons.AddRange(wagonsWhichCanBeFilled);
            wagonsWhichCanBeFilled.Clear();

            return(Wagons);
        }