Een kleurendoolhof bestaat uit

Hieronder staat bijvoorbeeld een kleurendoolhof met een $$5 \times 5$$ rooster van gekleurde cirkels. Het kleurenpatroon geeft in dit geval aan dat je eerst een oranje cirkel moet bezoeken, gevolgd door een groene cirkel, dan weer een oranje cirkel, een groene cirkel, enzoverder.

opgave
Deze opgave van een gekleurd doolhof bestaat uit een $$5 \times 5$$ rooster van gekleurde cirkels. Het kleurenpatroon geeft aan dat je eerst een oranje cirkel moet bezoeken, gevolgd door een groene cirkel, dan weer een oranje cirkel, een groene cirkel, enzoverder.

Een route door het rooster van een kleurendoolhof begint bij een gekleurde cirkel in het rooster en loopt telkens verder naar één van de naburige cirkels ten noorden (N), oosten (E), zuiden (S) of westen (W) van de cirkel. Een route kan meerdere keren langs dezelfde cirkel van het rooster lopen.

De opdracht bestaat erin om de uitweg door het kleurendoolhof te vinden: de kortste route die de onderste rij van het rooster verbindt met de bovenste rij. Daarbij moet de kleur van de eerste cirkel langs de route (op de onderste rij) overeenkomen met de eerste kleur van het kleurenpatroon. De kleur van elke volgende cirkel langs de route moet overeenkomen met de volgende kleur van het kleurenpatroon, waarbij na de laatste kleur terug de eerste kleur van het patroon volgt. Het kleurenpatroon hoeft niet per se volledig tot op het einde afgelopen te worden.

Elk kleurendoolhof is zo opgesteld dat er altijd één uitweg is. Dit is bijvoorbeeld de uitweg door het kleurendoolhof dat we hierboven als voorbeeld gebruikt hebben:

oplossing
De unieke uitweg door het gekleurd doolhof, die de onderste rij verbindt met de bovenste rij.

Opgave

We stellen een kleur voor als een hoofdletter (String). Dezelfde kleur wordt steeds voorgesteld als dezelfde hoofdletter. Verschillende kleuren wordt steeds voorgesteld als verschillende hoofdletters.

We stellen een reeks kleuren (en dus ook een kleurenpatroon) voor als een string (String) met hoofdletters die corresponderen met de opeenvolgende kleuren in de reeks.

We stellen een rooster met gekleurde cirkels voor als de reeks kleuren van de cirkels in het rooster, waarbij een rij cirkels van links naar rechts doorlopen wordt en de rijen van boven naar onder doorlopen worden.

Door de rijen (resp. kolommen) van een rooster van boven naar onder (resp. van links naar rechts) te nummeren vanaf 0, kunnen we de positie van een cirkel in het rooster voorstellen als een reeks $$[r, k]$$ (Array), waarbij $$r$$ (Number) het rijnummer en $$k$$ (Number) het kolomnummer aanduidt.

Een route door een kleurendoolhof kunnen we dan voorstellen als een reeks (Array) met posities (Array) van de opeenvolgende cirkels waar de route langs loopt.

Definieer een klasse Doolhof waarmee kleurendoolhoven kunnen voorgesteld worden. Bij het aanmaken van een kleurendoolhof (Doolhof) moet drie argumenten doorgegeven worden: i) het aantal rijen (Number) van het rooster, ii) het rooster met gekleurde cirkels (String) en iii) het kleurenpatroon (String). Daarbij mag ervan uitgegaan worden dat de argumenten een geldig kleurendoolhof met een unieke uitweg beschrijven, zonder dat dit expliciet moet gecontroleerd worden.

Op een kleurendoolhof $$\mathcal{M}$$ (Doolhof) moet je minstens de volgende methoden kunnen aanroepen:

Voorbeeld

> let doolhof = new Doolhof(5, "BOROYORBGRBOGOYYGBYGRORBR", "OG")
> doolhof.kleur(4, 1)
"O"
> doolhof.kleur(3, 1)
"G"
> doolhof.kleur(2, 1)
"O"
> doolhof.kleur(2, 2)
"G"
> doolhof.route([4, 1], "NNEE")
[[4, 1], [3, 1], [2, 1], [2, 2], [2, 3]]
> console.log(doolhof.weergave(doolhof.route([4, 1], "NNEE")))
. . . . .
. . . . .
. O G O .
. G . . .
. O . . .
> doolhof.uitweg()
[[4, 1], [3, 1], [2, 1], [2, 2], [2, 3], [1, 3], [0, 3]]
> console.log(doolhof.weergave(doolhof.uitweg()))
. . . O .
. . . G .
. O G O .
. G . . .
. O . . .

> doolhof = new Doolhof(10, "OBYRPORROBRYPPPPGYPRRGOOPOYYYGBOPPGOPBRYYOBRPGRGGPGYBORBRRBGPOPRGPOBRYYORYBRBROYRRRRBOBRBPYOROGRGYOGOYOYBGORROBBBYPGYGOYROBOYBGGGBROYRBBBYRGBPGYGGRPYOOROYBOGBRP", "BRYYO")
> doolhof.route([9, 10], "NWSWNNWNWNESSWSWWNNNNEEENWSWNNEEEEEENN")
[(9, 10), (8, 10), (8, 9), (9, 9), (9, 8), (8, 8), (7, 8), (7, 7), (6, 7), (6, 6), (5, 6), (5, 7), (6, 7), (7, 7), (7, 6), (8, 6), (8, 5), (8, 4), (7, 4), (6, 4), (5, 4), (4, 4), (4, 5), (4, 6), (4, 7), (3, 7), (3, 6), (4, 6), (4, 5), (3, 5), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (2, 11), (1, 11), (0, 11)]
> doolhof.uitweg()
[(9, 10), (8, 10), (8, 9), (9, 9), (9, 8), (8, 8), (7, 8), (7, 7), (6, 7), (6, 6), (5, 6), (5, 7), (6, 7), (7, 7), (7, 6), (8, 6), (8, 5), (8, 4), (7, 4), (6, 4), (5, 4), (4, 4), (4, 5), (4, 6), (4, 7), (3, 7), (3, 6), (4, 6), (4, 5), (3, 5), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (2, 11), (1, 11), (0, 11)]
> console.log(doolhof.weergave(doolhof.uitweg()))
. . . . . . . . . . . Y . . . .
. . . . . . . . . . . Y . . . .
. . . . . B R Y Y O B R . . . .
. . . . . O R B . . . . . . . .
. . . . R Y Y O . . . . . . . .
. . . . B . B R . . . . . . . .
. . . . O . O Y . . . . . . . .
. . . . Y . O Y R . . . . . . .
. . . . Y R B . B Y R . . . . .
. . . . . . . . O Y B . . . . .

Het eerste deel van dit voorbeeld werkt met het kleurendoolhof uit de inleiding. Hieronder zie je de grafische voorstelling van het kleurendoolhof uit in het tweede deel, met een $$10 \times 16$$ rooster en een patroon met 5 kleuren (blauw — rood — geel (2x) — oranje). Klik hier om de unieke uitweg door dit kleurendoolhof weer te geven.

opgave (10x16)
Deze opgave van een gekleurd doolhof bestaat uit een $$10 \times 16$$ rooster van gekleurde cirkels en een patroon met 5 kleuren (blauw — rood — geel (2x) — oranje).