Ik ben bezig met een programmeer opdracht om het 8 (N) koninginnen probleem op te lossen.
(wiki hier: Wikipedia: Eight queens puzzle ) maar in het kort gaat het erom dat je 8 (N) koninginnen neerzet op een bord van 8x8 (NxN).
Een 'naive' manier om dit op te lossen is gewoon een int[][] maken om het bord voor te stellen. Nu geeft wikipedia echter aan dat een logisch slimmere manier is om het bord te representeren door een enkele int[]. Immers kunnen er geen 2 koninginnen naast elkaar staan.
Een kongining die hier staat:
|...|...|...|x|......
wordt dus weergegeven als int[rijnummer] = 3; (3 is het kolomnummer in dit geval).
Dit werkt erg goed en op deze manier zijn er minder 'collision checks' nodig en is het allemaal wat aardiger voor het werkgeheugen. (ook al ga ik depth first).
Maar nu komt het echte probleem: op deze manier krijg je voor 8 koningingen op een 8x8 bord 92 verschillende oplossingen. Maar van deze 92 oplossingen zijn er nog 80 te maken door de echte unieke 12 te roteren of te spiegelen.
Spiegelen is vrij simpel op een 1 dimensionale array en had ik snel werkend.
Maar ik krijg het niet voor elkaar om een algoritme te bedenken wat een schaakbord een kwartslag kan draaien zonder dat ik de representatie via een int[] eerst weer omzet naar een int[][] dan draai en dan weer terug zet.
Heeft iemand hier misschien een tip voor? Ik heb al flink wat uren gespit door code van andere, maar het blijft allemaal bij voorbeeld code om de 92 te vinden en het roteren en spiegelen wordt niet gedaan. (Ik heb wel 1 oplossing gezien die er dus inderdaad weer een multidimensionale array van maakt, maar dat schiet dus ook niet op).
Is hier een handige oplossing voor? Of moet ik het toch omzetten naar een multi en dan weer terug naar een enkele?
(wiki hier: Wikipedia: Eight queens puzzle ) maar in het kort gaat het erom dat je 8 (N) koninginnen neerzet op een bord van 8x8 (NxN).
Een 'naive' manier om dit op te lossen is gewoon een int[][] maken om het bord voor te stellen. Nu geeft wikipedia echter aan dat een logisch slimmere manier is om het bord te representeren door een enkele int[]. Immers kunnen er geen 2 koninginnen naast elkaar staan.
Een kongining die hier staat:
|...|...|...|x|......
wordt dus weergegeven als int[rijnummer] = 3; (3 is het kolomnummer in dit geval).
Dit werkt erg goed en op deze manier zijn er minder 'collision checks' nodig en is het allemaal wat aardiger voor het werkgeheugen. (ook al ga ik depth first).
Maar nu komt het echte probleem: op deze manier krijg je voor 8 koningingen op een 8x8 bord 92 verschillende oplossingen. Maar van deze 92 oplossingen zijn er nog 80 te maken door de echte unieke 12 te roteren of te spiegelen.
Spiegelen is vrij simpel op een 1 dimensionale array en had ik snel werkend.
Maar ik krijg het niet voor elkaar om een algoritme te bedenken wat een schaakbord een kwartslag kan draaien zonder dat ik de representatie via een int[] eerst weer omzet naar een int[][] dan draai en dan weer terug zet.
Heeft iemand hier misschien een tip voor? Ik heb al flink wat uren gespit door code van andere, maar het blijft allemaal bij voorbeeld code om de 92 te vinden en het roteren en spiegelen wordt niet gedaan. (Ik heb wel 1 oplossing gezien die er dus inderdaad weer een multidimensionale array van maakt, maar dat schiet dus ook niet op).
Is hier een handige oplossing voor? Of moet ik het toch omzetten naar een multi en dan weer terug naar een enkele?