Bij een verkaveling wordt een stuk land opgedeeld in verschillende kavels die elk een andere eigenaar kunnen hebben. Vroeger hadden de boeren kleine stukken land, die vaak door elkaar heen lagen. Een boer moest toen over het land van een andere boer lopen of rijden om naar zijn eigen kavels te gaan. Tengevolge van de schaalvergroting van de landbouw wordt tegenwoordig gewerkt met vierkante kavels, en streven boeren ernaar om te werken met zo groot mogelijke percelen: rechthoekige gebieden van aaneengesloten kavels.
Onderstaand voorbeeld toont een rechthoekig stuk land dat werd opgedeeld in $$10 \times 10$$ vierkante kavels. Drie percelen (witte rechthoeken) werden reeds door boeren in gebruik genomen. Zoek de oppervlakte van het grootst mogelijke perceel waarvan nog geen enkel kavel in gebruik werd genomen. In dit voorbeeld is dit een perceel dat bestaat uit 16 kavels, zoals aangegeven door de gestreepte rechthoek.
Definieer een klasse Verkaveling met volgende methoden:
Een initialisatiemethode __init__ waarmee een verkaveling kan aangemaakt worden van een rechthoekig stuk land. Deze verkaveling bestaat uit een $$m \times n$$ rooster van kavels, met $$m$$ het aantal rijen en $$n$$ het aantal kolommen in het rooster. De waarden $$m$$ en $$n$$ moeten als argumenten aan de initialisatiemethode doorgegeven worden. Initieel wordt nog geen enkel kavel gereserveerd (toegewezen aan een eigenaar).
Een methode __str__ waarmee de huidige reservaties van de kavels uit de verkaveling kunnen weergegeven worden. Aan deze methode kunnen geen argumenten meegegeven worden. Een gereseveerd kavel wordt aangegeven met een koppelteken (-). Een kavel dat nog niet gereserveerd werd, wordt aangegeven met een hekje (#). Hieronder vind je enkele voorbeelden van hoe de volledige verkaveling moet weergegeven worden.
Een methode reserveer waarmee een rechthoekig perceel kan gereserveerd worden. Deze methode heeft vier parameters, waaraan natuurlijke getallen kunnen doorgegeven worden. De eerste twee parameters stellen het rij- en kolomnummer van de positie van de linkerbovenhoek van het perceel voor, en moeten verplicht doorgegeven worden. De laatste twee parameters zijn optioneel, en stellen het rij- en kolomnummer van de positie van de rechteronderhoek van het perceel voor. Indien deze laatste parameters niet worden doorgegeven, dan bestaat het perceel uit slechts één kavel, waarvan de positie wordt aangegeven door de eerste twee parameters. Zoals aangegeven in bovenstaande afbeelding worden de rijen genummerd van boven naar onder en de kolommen van links naar rechts, waarbij de nummering steeds start vanaf nul. Indien het perceel kavels bevat die reeds gereserveerd werden, dan moet er geen enkel kavel gereserveerd worden, en moet de methode een AssertionError opwerpen zoals geïllustreerd in onderstaand voorbeeld.
Een methode grootstePerceel die de grootte teruggeeft van het grootste perceel dat nog kan gereserveerd worden. Dit is dus de grootte van het grootste rechthoekige gebied dat bestaat uit kavels die nog niet gereserveerd werden. Aan deze methode kunnen geen argumenten doorgegeven worden.
>>> verkaveling = Verkaveling(6, 6)
>>> print(verkaveling)
######
######
######
######
######
######
>>> verkaveling.grootstePerceel()
36
>>> verkaveling.reserveer(3, 0, 5, 2)
>>> print(verkaveling)
######
######
######
---###
---###
---###
>>> verkaveling.grootstePerceel()
18
>>> verkaveling.reserveer(0, 3, 2, 5)
>>> print(verkaveling)
###---
###---
###---
---###
---###
---###
>>> verkaveling.grootstePerceel()
9
>>> verkaveling.reserveer(2, 2, 3, 3)
Traceback (most recent call last):
AssertionError: perceel kan niet gereserveerd worden
>>> print(verkaveling)
###---
###---
###---
---###
---###
---###