Merlijn heeft voor zich een rij van bekers in drie verschillende kleuren (gecodeerd door de getallen 0, 1 en 2). Hij kan een toverspreuk doen die telkens twee bekers van plaats wisselt. In zijn receptenboek staat de volgorde die de kleuren van de bekers moeten hebben om zijn volgende bezewering te doen slagen.

Een rij bekers.

Aangezien hij een luie tovenaar is wil hij de gevraagde volgorde met zo weinig mogelijk verwisselingen maken.

Bijvoorbeeld: als de bekers in de volgorde [0, 1, 2, 1] staan en ze moeten in de volgorde [1, 2, 1, 0] komen, dan kan hij dit doen met twee verwisselingen:

  1. Wissel posities 0 en 3: [0, 1, 2, 1][1, 1, 2, 0]
  2. Wissel posities 1 en 2: [1, 1, 2, 0][1, 2, 1, 0]

Implementeer de gegeven interface1 Swapper met een klasse genaamd MinimalSwapper. Hiervoor schrijf je een functie int minimalNumberOfSwaps(List<Integer> start, List<Integer> goal), die de startconfiguratie en eindconfiguratie neemt, en teruggeeft wat het minimaal aantal verwisselingen is waarmee de eerste lijst in de tweede kan worden omgezet. Als het onmogelijk is om dit te verwezenlijken geef je -1 terug. De meegegeven lijsten mogen niet aangepast worden.

Gebruik de testklasse SimpleTest2 om je oplossing lokaal te testen. Je kan hierin eenvoudig extra testgevallen toevoegen.

Hint: met new ArrayList<>(List<T> list) kan je een kopie van een lijst maken en met Collections.swap(List<T> list, int i, int j) kan je twee elementen in een lijst omwisselen.