Op een schaakbord staan een aantal koninginnen, paarden en pionnen opgesteld. Bepaal hoeveel onbezette vierkanten er zijn op het schaakbord. Dit zijn vierkanten die door geen enkele koningin en door geen enkel paard kunnen aangevallen worden. We noemen dit de veilige vierkanten van het schaakbord. Hierbij dienen de pionnen enkel om de bewegingsruimte van de koninginnen af te blokken. Ze kunnen zelf geen aanvallen uitvoeren.

koninginnen, paarden en pionnen
Deze opstelling van koninginnen, paarden en pionnen op een schaakbord laat nog zes veilige vierkanten achter.

Voor zij die de regels van het schaakspel niet kennen, geven we nog mee dat een paard elk onbezet vierkant van het schaakbord kan aanvallen dat gelegen is op het overstaande hoekpunt van een $$2 \times 3$$ rechthoek ten opzichte van zijn huidige positie. Een koningin kan een aanval uitvoeren op elk zichtbaar vierkant in elk van de acht horizontale, verticale of diagonale richtingen ten opzichte van zijn huidige positie. Merk hierbij op dat een aanvalsbeweging van een koningin afgeblokt wordt door elk ander stuk op het schaakbord, terwijl de aanval van een paard nooit door andere stukken kan geblokkeerd worden.

aanvalsrichtingen paard
Het zwarte paard kan aanvallen uitvoeren naar elk van de acht vierkanten die zijn aangeduid met een zwarte cirkel. Het witte paard kan enkel aanvallen uitvoeren naar de twee vierkanten aangeduid met een witte cirkel.
aanvalsrichtingen koningin
Een koningin kan alle vierkanten aanvallen in horizontale, verticale en diagonale richting, hier aangeduid met een zwarte cirkel.

Opgave

Bepaal het aantal veilige vierkanten op een schaakbord waarop een aantal koninginnen, paarden en pionnen werden neergezet.

Hiervoor moet je de volgende drie functies schrijven waaraan telkens drie argumenten moeten doorgegeven worden die de configuratie van het schaakbord beschrijven: i) het aantal rijen $$r \in \mathbb{N}$$ (int) van het schaakbord ($$r \geq 2$$), ii) het aantal kolommen $$k \in \mathbb{N}$$ (int) van het schaakbord ($$k \geq 2$$) en iii) een reeks (list of tuple) met de posities van de stukken op het schaakbord. De positie van een stuk wordt omschreven door een reeks (list of tuple) met drie elementen. Het eerste element is een string (str) die aangeeft over welk soort stuk het gaat (Q voor koningin, K voor paard en P voor pion). Het tweede en derde element geven de rij (int) en de kolom (int) aan waarop het stuk zich bevindt. Rijen en kolommen worden hierbij steeds genummerd vanaf nul, zoals bij de schaakborden in bovenstaande afbeeldingen.

Voorbeeld

>>> schaakbord(4, 4, (('K', 0, 1), ('Q', 0, 3), ('P', 1, 2), ('Q', 1, 3)))
[['', 'K', '', 'Q'], ['', '', 'P', 'Q'], ['', '', '', ''], ['', '', '', '']]
>>> schaakbord(2, 3, (('Q', 0, 1), ('K', 0, 0)))
[['K', 'Q', ''], ['', '', '']]
>>> schaakbord(8, 8, (('Q', 4, 3), ))
[['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', 'Q', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', '']]
>>> schaakbord(8, 8, (('K', 4, 3), ('K', 7, 7)))
[['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', 'K', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', 'K']]

>>> onveilige_vierkanten(4, 4, (('K', 0, 1), ('Q', 0, 3), ('P', 1, 2), ('Q', 1, 3)))
[['', 'K', '*', 'Q'], ['', '', 'P', 'Q'], ['*', '', '*', '*'], ['', '*', '', '*']]
>>> onveilige_vierkanten(2, 3, (('Q', 0, 1), ('K', 0, 0)))
[['K', 'Q', '*'], ['*', '*', '*']]
>>> onveilige_vierkanten(8, 8, (('Q', 4, 3), ))
[['', '', '', '*', '', '', '', '*'], ['*', '', '', '*', '', '', '*', ''], ['', '*', '', '*', '', '*', '', ''], ['', '', '*', '*', '*', '', '', ''], ['*', '*', '*', 'Q', '*', '*', '*', '*'], ['', '', '*', '*', '*', '', '', ''], ['', '*', '', '*', '', '*', '', ''], ['*', '', '', '*', '', '', '*', '']]
>>> onveilige_vierkanten(8, 8, (('K', 4, 3), ('K', 7, 7)))
[['', '', '', '', '', '', '', ''], ['', '', '', '', '', '', '', ''], ['', '', '*', '', '*', '', '', ''], ['', '*', '', '', '', '*', '', ''], ['', '', '', 'K', '', '', '', ''], ['', '*', '', '', '', '*', '*', ''], ['', '', '*', '', '*', '*', '', ''], ['', '', '', '', '', '', '', 'K']]

>>> veilige_vierkanten(4, 4, (('K', 0, 1), ('Q', 0, 3), ('P', 1, 2), ('Q', 1, 3)))
6
>>> veilige_vierkanten(2, 3, (('Q', 0, 1), ('K', 0, 0)))
0
>>> veilige_vierkanten(8, 8, (('Q', 4, 3), ))
36
>>> veilige_vierkanten(8, 8, (('K', 4, 3), ('K', 7, 7)))
52