Naburige getallen is een puzzel die gebruik maakt van een rechthoekig $$m \times n$$ rooster met $$m$$ rijen en $$n$$ kolommen. Initieel zijn de cellen van het rooster allemaal leeg. Het doel is om de cijfers 1 tot en met 9 in te vullen in de cellen van het rooster, waarbij de som van alle cijfers in het rooster zo groot mogelijk moet zijn. Hierbij gelden de volgende regels:

Voor gegeven dimensies van een rechthoekig rooster is het best mogelijk dat er meerdere optimale oplossingen zijn (oplossingen die eenzelfde maximale som opleveren). Hieronder geven we je alvast een voorbeeld van een geldige oplossing met som 427. Dit is de meest optimale oplossing die momenteel gekend is voor een $$10 \times 10$$ rooster.

naburige getallen
Meest optimale oplossing met som 427 die gekend is voor de puzzel "naburige getallen" met een $$10 \times 10$$ rooster.

Opgave

Het vinden van optimale oplossingen voor gegeven dimensies van een rechthoekig rooster is een ontzettend uitdagend probleem. Voor deze opgave beperken we ons tot het controleren of een rechthoekig rooster dat ingevuld werd met gehele getallen wel degelijk een geldige oplossing is voor de puzzel. Met andere woorden, dat het rooster voldoet aan de regels die hierboven opgelijst worden. We gebruiken twee manieren om een rechthoekig $$m \times n$$ rooster voor te stellen dat werd ingevuld met de cijfers van 1 tot 9.

Het rooster kan voorgesteld worden als een string waarin alle cijfers opgelijst worden als we de cellen van het rooster van links naar rechts en van boven naar onder aflopen. Samen met deze string moet ook het aantal kolommen gegeven worden, om het rooster op een eenduidige manier vast te leggen. Het aantal cijfers in de string moet uiteraard een veelvoud zijn van het aantal kolommen. We noemen dit de stringvoorstelling van het rooster.

Het rooster kan ook voorgesteld worden als een lijst waarvan de elementen bestaan uit de $$m$$ rijen van het rooster, opgelijst van boven naar onder. Elke rij wordt zelf ook voorgesteld als een lijst met de $$n$$ gehele getallen op die rij, opgelijst van links naar rechts. We noemen dit de lijstvoorstelling van het rooster.

De rijen van het rooster worden van boven naar onder genummerd vanaf nul, en de kolommen van het rooster worden van links naar rechts genummerd vanaf nul. Gevraagd wordt:

Voorbeeld

>>> lijstvoorstelling('111222333', 3)
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
>>> lijstvoorstelling('123321123', 3)
[[1, 2, 3], [3, 2, 1], [1, 2, 3]]
>>> lijstvoorstelling('424313424', 3)
[[4, 2, 4], [3, 1, 3], [4, 2, 4]]
>>> lijstvoorstelling('1541253263631421', 4)
[[1, 5, 4, 1], [2, 5, 3, 2], [6, 3, 6, 3], [1, 4, 2, 1]]
>>> lijstvoorstelling('1541253263631421', 5)
Traceback (most recent call last):
AssertionError: ongeldige stringvoorstelling

>>> rooster = [[1, 5, 4, 1], [2, 5, 3, 2], [6, 3, 6, 3], [1, 4, 2, 1]]
>>> buren(2, 2, rooster)
{1, 2, 3, 4, 5}
>>> buren(2, 3, rooster)
{1, 2, 3, 6}
>>> buren(0, 0, rooster)
{2, 5}
>>> buren(4, 4, rooster)
Traceback (most recent call last):
AssertionError: ongeldige positie

>>> isNaburig('111222333', 3)
False
>>> isNaburig('123321123', 3)
True
>>> isNaburig('424313424', 3)
True
>>> isNaburig('1541253263631421', 4)
True
>>> isNaburig('1541253263631421', 5)
Traceback (most recent call last):
AssertionError: ongeldige stringvoorstelling

Hieronder geven we een grafische voorstelling van alle naburige cellen (lichtgroen) voor de cellen (donkergroen) waarmee de functie buren getest wordt in bovenstaande interactieve sessie.

naburige cellen
Naburige cellen (lichtgroen) van cel $$(2, 2)$$ (donkergroen) in het rooster.
naburige cellen
Naburige cellen (lichtgroen) van cel $$(2, 3)$$ (donkergroen) in het rooster.
naburige cellen
Naburige cellen (lichtgroen) van cel $$(0, 0)$$ (donkergroen) in het rooster.