De cellen van een rechthoekig $$m \times n$$ rooster met $$m$$ rijen en $$n$$ kolommen bevatten elk een getal van 0 tot en met 9. Op die manier ontstaan groepen van aangrenzende cellen die allemaal hetzelfde getal bevatten, waarbij cellen aan elkaar grenzen als ze een gemeenschappelijke zijde hebben (horizontaal of verticaal). Onderstaand $$4 \times 4$$ rooster heeft bijvoorbeeld vijf groepen die elk met eigen kleur aangeduid worden.

samensmelten
Hoeveel zetten heb je minimaal nodig om alle groepen van dit $$4 \times 4$$ rooster te laten samensmelten?

In één zet worden de getallen in alle cellen van een groep met 1 verhoogd of verlaagd, waardoor de groep kan samensmelten met andere groepen. Hierbij mag de waarde in de cellen nooit kleiner worden dan 0 of groter dan 9. De uitdaging bestaat erin om met een minimum aan zetten alle cellen van het rooster tot één enkele groep te laten samensmelten. Voor het rooster hierboven volstaan twee zetten:

Opgave

Definieer een klasse Rooster waarmee rechthoekige roosters van cijfers kunnen voorgesteld worden, waarin zetten kunnen uitgevoerd worden om de groepen te laten samensmelten. Bij het aanmaken van een nieuw rooster (Rooster) moeten drie argumenten doorgegeven worden: i) een string (String) met de cijfers in het rooster uitgelezen van links naar rechts en van boven naar onder, ii) het aantal rijen (Number) van het rooster en iii) het aantal kolommen (Number) van het rooster. Het derde argument mag weggelaten worden bij vierkante roosters (waarbij het aantal rijen en kolommen gelijk zijn).

We nummeren de rijen van het rooster van boven naar onder vanaf nul. Analoog nummeren we ook de kolommen van links naar rechts vanaf nul. Op die manier kan de positie van een cel in het rooster aangeduid worden door het paar $$(r, k)$$  waarbij $$r$$ het rijnummer en $$k$$ het kolomnummer is waarop de cel terug te vinden is in het rooster.

Op een rooster $$R$$ (Rooster) moeten minstens de volgende methoden kunnen aangeroepen worden:

De methoden toArray, toString, groep en isOpgelost mogen rooster $$R$$ niet wijzigen. De methode zet moet daarentegen rooster $$R$$ wel aanpassen.

Opmerking

Alle gevraagde methoden mogen ervan uitgaan dat de waarden die eraan doorgegeven worden en alle acties die ze moeten uitvoeren geldig zijn, zonder dat ze dit expliciet moeten controleren.

Voorbeeld

> const rooster = new Rooster("1221133113322222", 4)
> rooster.toArray()
[[ 1, 2, 2, 1 ], [ 1, 3, 3, 1 ], [ 1, 3, 3, 2 ], [ 2, 2, 2, 2 ]]
> rooster.toString()
1221
1331
1332
2222
> rooster.groep(2, 1)
[[ 1, 1 ], [ 1, 2 ], [ 2, 1 ], [ 2, 2 ]]
> rooster.groep(0, 3)
[[ 0, 3 ], [ 1, 3 ]]
> rooster.groep(1, 0)
[[ 0, 0 ], [ 1, 0 ], [ 2, 0 ]]
> rooster.isOpgelost()
false
> rooster.zet(1, 1, false).toString()
1221
1221
1222
2222
> rooster.isOpgelost()
false
> rooster.zet(3, 2, false).toString()
1111
1111
1111
1111
> rooster.isOpgelost()
true