Een schuifpuzzel bestaat uit een rechthoekig bord van $$m$$ rijen en $$n$$ kolommen, waarbij één van de velden leeg blijft. Puzzelstukken op horizontaal of verticaal aangrenzende velden kunnen naar dit lege veld geschoven worden. Hierdoor verschuift in essentie het lege veld, vandaar de naam van de puzzel. De eerste schuifpuzzel werd uitgevonden door Noyes Chapman en ontketende in 1880 een echte puzzelgekte.

Noyes Chapman's schuifpuzzel
De schuifpuzzel uitgevonden door Noyes Chapman bestond uit een $$4 \times 4$$ bord waarvan de velden genummerd waren van 1 tot en met 15.

Bij verschillende varianten van de schuifpuzzel worden puzzelstukken gemarkeerd met getallen, letters of stukjes van een afbeelding. Het spel bestaat er dan in om de puzzelstukken eerst een groot aantal keer te verschuiven, zodat ze in een schijnbaar willekeurige volgorde op het bord staan, en daarna te proberen om de stukken terug in de oorspronkelijke volgorde op het bord te schuiven.

Opgave

Definieer een klasse Schuifpuzzel waarmee schuifpuzzels kunnen voorgesteld worden, waarvan de puzzelstukken gemarkeerd zijn met ASCII karakters. Deze klasse moet volgende methoden implementeren:

Voorbeeld

Onderstaand voorbeeld toont hoe je een $$4 \times 4$$ schuifpuzzel waarvan de letters initieel lezen als pikante loketten, over een aantal schuifbeurten kunt omvormen tot een puzzel waarvan de letters het woord platentektoniek spellen.

>>> puzzel = Schuifpuzzel(4, 4, 'pikante loketten'); print(puzzel)
pika
nte 
loke
tten
>>> puzzel.schuif('L'); print(puzzel)
pika
nt e
loke
tten
>>> puzzel.schuif('LL'); print(puzzel)
pika
 nte
loke
tten
>>> puzzel.schuif('L')
Traceback (most recent call last):
AssertionError: ongeldige richting: L
>>> puzzel.schuif('ORRRNLLLORNNLOORRRNLLNNLORNROOOLNRRNLLLORRNRN'); print(puzzel)
plat
ente
kton
iek 
>>> puzzel
Schuifpuzzel(4, 4, 'platentektoniek ')

>>> puzzel = Schuifpuzzel(2, 2, "AOJN")
Traceback (most recent call last):
AssertionError: puzzel moet minstens 3 rijen en kolommen hebben
>>> puzzel = Schuifpuzzel(4, 4, "AOJNDH")
Traceback (most recent call last):
AssertionError: ongeldige configuratie
>>> puzzel = Schuifpuzzel(4, 4, "OEKBFJOZKSOLDFKE")
Traceback (most recent call last):
AssertionError: ongeldige configuratie

Hieronder zie je de grafische voorstelling van deze schuifpuzzel.

schuifpuzzel
Voorbeeld van een schuifpuzzel waarvan de puzzelstukken gemarkeerd zijn met letters. Als je van links naar rechts, en van boven naar onder de letters achter elkaar zet, dan wordt over een aantal schuifbeurten de tekst pikante loketten omgezet in het woord platentektoniek.

Omdat we het niet kunnen laten, staan hieronder nog enkele voorbeelden van schuifpuzzels die in een aantal schuifbeurten wartaal (of toch niet?) omzetten in een herkenbaar woord.

>>> puzzel = Schuifpuzzel(3, 6, 'tardwean schpeaper')
>>> puzzel.schuif('LRLNLRROLNLORLNOORNRLRNRLLRRONRR')
>>> print(puzzel)
aardwe
tensch
apper 

>>> puzzel = Schuifpuzzel(7, 3, 'catal uteitsiripcinpe')
>>> puzzel.schuif('LONOLNNNONNNOONNRLNRRLRLR')
>>> print(puzzel)
act
ual
ite
its
pri
nci
pe 

>>> puzzel = Schuifpuzzel(4, 4, 'migraine toestel')
>>> puzzel.schuif('RROOLNNROORNNLNROLLLNRROLLORORRNLNLLNROOORNRNLNR')
>>> puzzel
Schuifpuzzel(4, 4, 'meteorietinslag ')

>>> puzzel = Schuifpuzzel(4, 4, 'eenstemmig opaal')
>>> puzzel.schuif('LLORORNRNNLOOROLNRNNLLORNLOLORRNLLNROOLNROOLNRROLNRROLNRNNLLLOORRRNN')
>>> puzzel
Schuifpuzzel(4, 4, 'paleomagnetisme ')